Я декодирую звук FLAC в память и передаю декодированные аудиоданные в OpenAL: void alBufferData (ALuint bufferName, ALenum format, const ALvoid *data, ALsizei size, ALsizei frequency);
Данные из декодированного звука попадают в мой std::vector<FLAC__int32> data_;
. В который я пытаюсь упаковать ЛЕВЫЙ и ПРАВЫЙ каналы (AL_FORMAT_STEREO16). Однако я не понимаю, как мне хранить / выравнивать эти каналы в моем data_
векторе.
Итак, у меня есть функция виртуального обратного вызова libFLAC:
FLAC__StreamDecoderWriteStatus
Source::write_callback (
FLAC__Frame const* _frame, FLAC__int32 const *const _buffer[])
{
for(size_t i(0); i < _frame->header.blocksize; i++) {
data_[index_] = _buffer[0][i]; // channel audio on the left
++index_;
data_[index_] = _buffer[1][i]; // what about the right channel?
} // jump
return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE;
} // main
На данный момент при воспроизведении звука я слышу только ЛЕВЫЙ канал. После того, как звук закончился, появляется статический звук, который, как я предполагаю, является недостающими данными ПРАВИЛЬНОГО канала. Как мне заставить работать ПРАВИЛЬНЫЙ канал?
Кроме того, это подпись обратного вызова метаданных согласно libFLAC:
void
Source::metadata_callback (const ::FLAC__StreamMetadata *metadata)
{
total_samples_ = metadata->data.stream_info.total_samples;
rate_ = metadata->data.stream_info.sample_rate;
channels_ = metadata->data.stream_info.channels;
bps_ = metadata->data.stream_info.bits_per_sample;
switch (bps_) {
case 16 :
if (channels_ > 1) {
format_ = AL_FORMAT_STEREO16; } else {
format_ = AL_FORMAT_MONO16; }
break;
case 8 :
if (channels_ > 1) {
format_ = AL_FORMAT_STEREO8; } else {
format_ = AL_FORMAT_MONO8; }
break;
default:
break;
}
size_ = (ALuint)(rate_ * channels_ * (bps_ / 8));
data_.resize(total_samples_); index_ = 0;
} // main
std::vector<FLAC__int16> data_;
вместоstd::vector<FLAC__int32> data_;
и упакую данные в массив влево, вправо, влево и т. Д. Будет ли это работать? - person 8-bitButterfly   schedule 01.12.2013size_ = (ALuint)(rate_ * channels_ * (bps_ / 8));
наsize_ = total_samples_ * sizeof(Source::Data);
. Source :: Data - это структураData { FLAC__int16 left_; FLAC__int16 right_; };
, которая теперь является типом данных шахты как таковыхstd::vector<Source::Data> data_;
. Так счастлив! Спасибо @Retired Ninja за все твои подсказки! - person 8-bitButterfly   schedule 01.12.2013