После некоторого устранения неполадок я понял (по крайней мере, я почти уверен), что через звуковые порты я передаю неверные значения через библиотеку JackAudio.
Это функция обратного вызова, которая в настоящее время работает, но производит невероятно искаженные звуки.
Я подозреваю, что мне нужно превратить мои двоичные (затем преобразованные в десятичные) данные в float
сигнал от -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()
возвращает vector<short>
и я получаю образец позиции через vector::at
,
Я отслеживаю положение образца из публичной переменной int через SamplePtr->SamplePosition
;
Вот отладочный вывод формата данных, который находится внутри вектора для 16-битного образца стереоволны 41000 Гц. Так что, похоже, данные, назначенные каналам, верны.
[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
Как и в обсуждении комментариев, решение состоит в том, чтобы передать ПРАВИЛЬНЫЙ формат данных в библиотеку Jackaudio — в этом случае формат является плавающей точкой в диапазоне от -1,0 до 1,0, где исходные данные short int
, поэтому конвертируем каждый образец по формуле x = sample / 32767.0;
даст желаемый результат.
Других решений пока нет …