PortAudio - 在Mono中工作,在立体声中出现故障?

时间:2013-09-22 04:44:24

标签: c portaudio

这让我难过;这在单声道中工作得很好,但是当我把它改成立体声时,它听起来很不稳定。这是交错问题还是什么(数据是交错的,顺便说一下)

编辑:将交错方法更改为更符合逻辑的方法,但仍无济于事......

    #include <pthread.h>
    #include <portaudio/portaudio.h>
    #include <sndfile.h>

    #define STEREO 2
    #define SAMPLE_RATE 44100

    typedef struct{
        M_float* data, *data_pos;
        sf_count_t frames;
    } StreamData;
    StreamData stream_data;

    int ProcessAudio(const void* input, void* output, ulong frames_per_buff,
            const PaStreamCallbackTimeInfo* time_info, PaStreamCallbackFlags flags, void* strm_data){

    M_StreamData* strm = (M_StreamData*)(strm_data);
    M_float* strm_out = (M_float*)(output);

    if(strm -> frames > frames_per_buff){

        for(sf_count_t frames_iter = 0; frames_iter < frames_per_buff;){
            M_float sample = (strm -> data_pos++)[0];
            strm_out[frames_iter] = sample;
            strm_out[++frames_iter] = sample;
        }

    }else{
        return (paComplete);
    }

    return (paContinue);
}

    void* StartAudio(void* params){
        SF_INFO info;
        info.channels = M_STEREO;
        info.samplerate = M_SAMPLE_RATE;
        info.format = SF_FORMAT_RAW | SF_FORMAT_FLOAT;

        SNDFILE* file = sf_open(u8"californication.raw", SFM_READ, &info);

        stream_data.data = malloc(info.frames * info.channels * sizeof(float));
        stream_data.data_pos = stream_data.data;
        stream_data.frames = sf_readf_float(file, stream_data.data, info.frames);

        sf_close(file);

        if(Pa_Initialize() != paNoError)exit(0);

        PaStream* pa_stream = NULLPTR_T;
        Pa_OpenDefaultStream(&pa_stream, 0, STEREO, paFloat32, SAMPLE_RATE, paFramesPerBufferUnspecified,
                &ProcessAudio, &stream_data);

        Pa_StartStream(pa_stream);
        Pa_Sleep(9001);
        Pa_StopStream(pa_stream);
        Pa_CloseStream(pa_stream);

        sf_close(file);
        free(stream_data.data);

        Pa_Terminate();

        return (NULLPTR_T);
    }

    int main(void){
        static pthread_t thrd;
        pthread_create(&thrd, NULLPTR_T, &M_StartAudio, NULLPTR_T);

        return (false);
    }

2 个答案:

答案 0 :(得分:2)

我不能确定没有编译你的代码,但看起来你的交错算法正在将两个样本写入输出缓冲区中的相同索引,而不是将一个样本写入输出缓冲区两次。

此代码:

  strm_out[frames_iter] = (strm -> data_pos++)[0];
  strm_out[frames_iter] = (strm -> data_pos++)[1];

应该看起来像:

M_float* sample =  (strm -> data_pos++)[0]; 
strm_out[frames_iter] = sample;
strm_out[++frames_iter] = sample;

同样,这可能不完全正确,但希望它说明了我的观点。

答案 1 :(得分:1)

尝试将framesPerBuffer更改为固定值。可被44100整除的值可能效果最佳。 4410和441可能是开始的好地方。

我在使用默认流时也遇到了问题。在Linux中,我通常指定要明确使用的设备,而不是使用pulse或default。您可以使用aplay -l获取系统上的设备列表。选择要使用的设备的索引。打开portaudio流时使用该索引。