0

FLAC オーディオをメモリにデコードし、デコードしたオーディオ データを OpenAL に渡します。void alBufferData (ALuint bufferName, ALenum format, const ALvoid *data, ALsizei size, ALsizei frequency);

デコードされたオーディオからのデータは私のものに入りstd::vector<FLAC__int32> data_;ます。LEFT および RIGHT チャネル (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

現在、オーディオの再生中、LEFT チャンネルしか聞こえません。サウンドの再生が終了した後にスタティック サウンドが発生しますが、これは RIGHT チャンネルのデータが欠落していると推測されます。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
4

1 に答える 1