Упаковка данных влево и вправо

Я декодирую звук 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

На данный момент, во время воспроизведения звука, я слышу только левый канал. После завершения воспроизведения звука возникает статический звук, который, как я предполагаю, является отсутствием данных канала RIGHT. Как заставить работать ПРАВОЙ канал?

Кроме того, это подпись обратного вызова метаданных согласно 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

0

Решение

Решение, которое работает, заключалось в следующем struct как векторный тип данных, например:

struct Data
{

FLAC__int16 channelLeft_;
FLAC__int16 channelRight_;

};

std::vector<Source::Data> data_;

чем назначить size_ вот так:

size_ = total_samples_ * sizeof(Source::Data);

наконец, цикл данных теперь должен быть:

for(size_t i(0); i < _frame->header.blocksize; i++) {

data_[index_].channelLeft_ = _buffer[0][i];
data_[index_].channelRight_ = _buffer[1][i];

++index_;
} // jump
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]