diff options
Diffstat (limited to 'src/audio/audio_decoder.cpp')
| -rw-r--r-- | src/audio/audio_decoder.cpp | 22 |
1 files changed, 13 insertions, 9 deletions
diff --git a/src/audio/audio_decoder.cpp b/src/audio/audio_decoder.cpp index 97f45534..07e05653 100644 --- a/src/audio/audio_decoder.cpp +++ b/src/audio/audio_decoder.cpp @@ -21,10 +21,12 @@ namespace audio { static const char* kTag = "DEC"; -static const std::size_t kSamplesPerChunk = 1024; +static const std::size_t kChunkSize = 1024; +static const std::size_t kReadahead = 8; AudioDecoder::AudioDecoder() : IAudioElement(), + arena_(kChunkSize, kReadahead, MALLOC_CAP_SPIRAM), stream_info_({}), has_samples_to_send_(false), needs_more_input_(true) {} @@ -104,23 +106,25 @@ auto AudioDecoder::Process() -> cpp::result<void, AudioProcessingError> { stream_info_->bits_per_sample = format.bits_per_sample; stream_info_->sample_rate = format.sample_rate_hz; stream_info_->channels = format.num_channels; - - chunk_size_ = kSamplesPerChunk * (*stream_info_->bits_per_sample); - stream_info_->chunk_size = chunk_size_; - ESP_LOGI(kTag, "pcm stream chunk size: %u bytes", chunk_size_); + stream_info_->chunk_size = kChunkSize; auto event = StreamEvent::CreateStreamInfo(input_events_, *stream_info_); SendOrBufferEvent(std::unique_ptr<StreamEvent>(event)); } - auto chunk = std::unique_ptr<StreamEvent>( - StreamEvent::CreateChunkData(input_events_, chunk_size_)); + auto block = arena_.Acquire(); + if (!block) { + return {}; + } + auto write_res = - current_codec_->WriteOutputSamples(chunk->chunk_data.bytes); - chunk->chunk_data.bytes = chunk->chunk_data.bytes.first(write_res.first); + current_codec_->WriteOutputSamples({block->start, block->size}); + block->used_size = write_res.first; has_samples_to_send_ = !write_res.second; + auto chunk = std::unique_ptr<StreamEvent>( + StreamEvent::CreateArenaChunk(input_events_, *block)); if (!SendOrBufferEvent(std::move(chunk))) { return {}; } |
