少しトラブルシューティングを行った後、JackAudio ライブラリを介してサウンド ポートに間違った種類の値を供給していることに気付きました (少なくとも私は確信しています)。
これは現在機能しているコールバック関数ですが、信じられないほど歪んだサウンドを生成します。
float
2 進数 (後で 10 進数に変換) データを-1 から 1 の間の信号に変換する必要があると思います。
どうすれば後者を行うことができますか?
現在、16 ビットのウェーブ音楽ファイルをフィードしています。各サンプルのサイズは ですshort
。
static int Process( jack_nframes_t nframes, void * arg )
{
SamplerClass * SamplerPtr = ( SamplerClass * ) arg;
jack_default_audio_sample_t * LeftChannel, * RightChannel;
LeftChannel = ( jack_default_audio_sample_t * ) jack_port_get_buffer( LeftChannelOutputPort, nframes );
RightChannel = ( jack_default_audio_sample_t * ) jack_port_get_buffer( RightChannelOutputPort, nframes );
for( unsigned int i = 0; i<nframes; i++)
{
LeftChannel[i] = SamplerPtr->SoundFile->getSoundDataRef().at( SamplerPtr->SamplePosition ) ;
RightChannel[i] = SamplerPtr->SoundFile->getSoundDataRef().at( SamplerPtr->SamplePosition + 1;
SamplerPtr->SamplePosition = SamplerPtr->SamplePosition + 2;
}
return 0;
}
getSoundDataRef()
は a を返し、vector<short>
を介してサンプル位置を取得しますvector::at
。
SamplePtr->SamplePosition
;を介して public int 変数からサンプル位置を追跡しています。
16 ビット 41000Hz ステレオ ウェーブ サンプルのベクトル内にあるデータ形式のデバッグ出力を次に示します。したがって、チャネルに割り当てられたデータは正しいようです。
[INFO] [ 18:48:50.492] 288756 vec index RCh >1844
[INFO] [ 18:48:50.492] 288757 vec index LCh >1401
[INFO] [ 18:48:50.492] 288758 vec index RCh >-1251