From cd6a9248db7a7f553bb01fc1aaa2f6edf03f961d Mon Sep 17 00:00:00 2001 From: shatty Date: Wed, 21 Jan 2004 22:59:28 +0000 Subject: [PATCH] adjust framecount/duration for mono/stereo, add channel_mask to vorbis header parsing, compute a "convenient" buffer size for speex decoding git-svn-id: file:///srv/svn/repos/haiku/trunk/current@6220 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- .../media/plugins/ogg/OggReaderPluginCodecs.cpp | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/add-ons/media/plugins/ogg/OggReaderPluginCodecs.cpp b/src/add-ons/media/plugins/ogg/OggReaderPluginCodecs.cpp index 9f1ebf86f9..3d6c4fc924 100644 --- a/src/add-ons/media/plugins/ogg/OggReaderPluginCodecs.cpp +++ b/src/add-ons/media/plugins/ogg/OggReaderPluginCodecs.cpp @@ -132,6 +132,13 @@ GetVorbisCodecStreamInfo(std::vector * packets, } else if (info.bitrate_lower > 0) { format->u.encoded_audio.bit_rate = info.bitrate_lower; } + if (info.channels == 1) { + format->u.encoded_audio.multi_info.channel_mask = B_CHANNEL_LEFT; + *frameCount *= 2; + *duration *= 2; + } else { + format->u.encoded_audio.multi_info.channel_mask = B_CHANNEL_LEFT | B_CHANNEL_RIGHT; + } format->u.encoded_audio.frame_size = sizeof(ogg_packet); format->u.encoded_audio.output.frame_rate = (float)info.rate; format->u.encoded_audio.output.channel_count = info.channels; @@ -207,6 +214,8 @@ GetSpeexCodecStreamInfo(std::vector * packets, } if (header->nb_channels == 1) { format->u.encoded_audio.multi_info.channel_mask = B_CHANNEL_LEFT; + *frameCount *= 2; + *duration *= 2; } else { format->u.encoded_audio.multi_info.channel_mask = B_CHANNEL_LEFT | B_CHANNEL_RIGHT; } @@ -215,8 +224,12 @@ GetSpeexCodecStreamInfo(std::vector * packets, format->u.encoded_audio.output.channel_count = header->nb_channels; format->u.encoded_audio.output.format = media_raw_audio_format::B_AUDIO_FLOAT; format->u.encoded_audio.output.byte_order = B_MEDIA_HOST_ENDIAN; - format->u.encoded_audio.output.buffer_size - = AudioBufferSize(&format->u.encoded_audio.output); + // allocate buffer, round up to nearest speex output_length size + int buffer_size = AudioBufferSize(&format->u.encoded_audio.output); + int output_length = header->frame_size * header->nb_channels * + (format->u.encoded_audio.output.format & 0xf); + buffer_size = ((buffer_size - 1) / output_length + 1) * output_length; + format->u.encoded_audio.output.buffer_size = buffer_size; return B_OK; }