-1

经过一番故障排除后,我意识到(至少我很确定)我一直在通过 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()返回 a vector<short>,我通过vector::at.

我正在通过公共 int 变量跟踪样本位置SamplePtr->SamplePosition

这是 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
4

1 回答 1

1

正如在评论讨论中,解决方案是将正确的数据格式传递给 Jackaudio 库 - 在这种情况下,格式是 -1.0 - 1.0 范围内的浮点数,其中原始数据是short int,因此使用公式转换每个样本x = sample / 32767.0;会给出想要的结果。

于 2012-12-26T12:52:07.297 回答