Try to use hwopus...

This commit is contained in:
rock88 2020-06-09 22:38:51 +03:00
parent ba1e479b4e
commit a3e1512e1e
2 changed files with 41 additions and 1 deletions

View file

@ -31,8 +31,18 @@ int AudrenAudioRenderer::init(int audio_configuration, const POPUS_MULTISTREAM_C
m_decoded_buffer = (s16 *)malloc(m_channel_count * m_samples_per_frame * sizeof(s16)); m_decoded_buffer = (s16 *)malloc(m_channel_count * m_samples_per_frame * sizeof(s16));
Result rc = 0;
#if USE_HW_DECODER
rc = hwopusDecoderMultistreamInitialize(&hw_decoder, m_sample_rate, m_channel_count, opus_config->streams, opus_config->coupledStreams, opus_config->mapping);
if (R_FAILED(rc)) {
Logger::error("Audren", "hwopusDecoderMultistreamInitialize failed: %x", rc);
return -1;
}
#else
int error; int error;
m_decoder = opus_multistream_decoder_create(opus_config->sampleRate, opus_config->channelCount, opus_config->streams, opus_config->coupledStreams, opus_config->mapping, &error); m_decoder = opus_multistream_decoder_create(opus_config->sampleRate, opus_config->channelCount, opus_config->streams, opus_config->coupledStreams, opus_config->mapping, &error);
#endif
memset(&m_driver, 0, sizeof(m_driver)); memset(&m_driver, 0, sizeof(m_driver));
memset(m_wavebufs, 0, sizeof(m_wavebufs)); memset(m_wavebufs, 0, sizeof(m_wavebufs));
@ -45,7 +55,7 @@ int AudrenAudioRenderer::init(int audio_configuration, const POPUS_MULTISTREAM_C
return -1; return -1;
} }
Result rc = audrenInitialize(&m_ar_config); rc = audrenInitialize(&m_ar_config);
if (R_FAILED(rc)) { if (R_FAILED(rc)) {
Logger::error("Audren", "audrenInitialize: %x", rc); Logger::error("Audren", "audrenInitialize: %x", rc);
return -1; return -1;
@ -97,10 +107,14 @@ int AudrenAudioRenderer::init(int audio_configuration, const POPUS_MULTISTREAM_C
void AudrenAudioRenderer::cleanup() { void AudrenAudioRenderer::cleanup() {
Logger::info("Audren", "Cleanup..."); Logger::info("Audren", "Cleanup...");
#if USE_HW_DECODER
hwopusDecoderExit(&hw_decoder);
#else
if (m_decoder) { if (m_decoder) {
opus_multistream_decoder_destroy(m_decoder); opus_multistream_decoder_destroy(m_decoder);
m_decoder = nullptr; m_decoder = nullptr;
} }
#endif
if (m_decoded_buffer) { if (m_decoded_buffer) {
free(m_decoded_buffer); free(m_decoded_buffer);
@ -123,6 +137,25 @@ void AudrenAudioRenderer::cleanup() {
} }
void AudrenAudioRenderer::decode_and_play_sample(char *data, int length) { void AudrenAudioRenderer::decode_and_play_sample(char *data, int length) {
#if USE_HW_DECODER
s32 DecodedDataSize = 0;
s32 DecodedSampleCount = 0;
printf("Start decoding...\n");
const void* opusin = (const void*)m_decoded_buffer;
size_t opusin_size = length * m_channel_count * sizeof(s16);
s16 *pcmbuf = (s16 *)data;
size_t pcmbuf_size = length * m_channel_count * sizeof(s16);
Result rc = hwopusDecodeInterleaved(&hw_decoder, &DecodedDataSize, &DecodedSampleCount, opusin, opusin_size, pcmbuf, pcmbuf_size);
if (R_SUCCEEDED(rc)) {
printf("Ok, play sound!\n");
} else {
printf("Fail...%x\n", rc);
}
#else
if (m_decoder && m_decoded_buffer) { if (m_decoder && m_decoded_buffer) {
int decoded_samples = opus_multistream_decode(m_decoder, (const unsigned char *)data, length, m_decoded_buffer, m_samples_per_frame, 0); int decoded_samples = opus_multistream_decode(m_decoder, (const unsigned char *)data, length, m_decoded_buffer, m_samples_per_frame, 0);
if (decoded_samples > 0) { if (decoded_samples > 0) {
@ -131,6 +164,7 @@ void AudrenAudioRenderer::decode_and_play_sample(char *data, int length) {
} else { } else {
Logger::fatal("Audren", "Invalid call of decode_and_play_sample"); Logger::fatal("Audren", "Invalid call of decode_and_play_sample");
} }
#endif
} }
int AudrenAudioRenderer::capabilities() { int AudrenAudioRenderer::capabilities() {

View file

@ -5,6 +5,8 @@
#define BUFFER_COUNT 5 #define BUFFER_COUNT 5
#define USE_HW_DECODER 1
class AudrenAudioRenderer: public IAudioRenderer { class AudrenAudioRenderer: public IAudioRenderer {
public: public:
AudrenAudioRenderer() {}; AudrenAudioRenderer() {};
@ -20,7 +22,11 @@ private:
size_t append_audio(const void *buf, size_t size); size_t append_audio(const void *buf, size_t size);
void write_audio(const void *buf, size_t size); void write_audio(const void *buf, size_t size);
#if USE_HW_DECODER
HwopusDecoder hw_decoder = {0};
#else
OpusMSDecoder* m_decoder = nullptr; OpusMSDecoder* m_decoder = nullptr;
#endif
s16* m_decoded_buffer = nullptr; s16* m_decoded_buffer = nullptr;
void* mempool_ptr = nullptr; void* mempool_ptr = nullptr;
void* current_pool_ptr = nullptr; void* current_pool_ptr = nullptr;