2013-09-22 88 views
2

這讓我很難過;這在單聲道中是完美的,但是當我將其改變爲立體聲時,它聽起來很波瀾不驚。這是一個交織問題,或者什麼(數據交錯,順便說一句)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); 
    } 
+0

什麼平臺(操作系統和版本)?什麼API? –

+0

@bjorn roche:windows 8 x64,portaudio v19,MME聲音 – Shokwav

回答

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; 

同樣,這可能不完全正確,但希望它說明了我的觀點。

+0

哦,我明白你在說什麼了!這確實有道理;我修改了我的帖子。然而,它仍然聽起來波濤洶涌......它真的沒有任何意義 – Shokwav

+0

我不希望賞金到期,所以我把它給你 – Shokwav

1

嘗試將framesPerBuffer更改爲固定值。可以被44100整除的值可能效果最好。 4410和441可能是開始的好地方。

我也有使用默認流的問題。在Linux中,我通常指定明確使用的設備,而不是使用pulse或default。您可以使用aplay -l來獲取系統中的設備列表。選擇您要使用的設備的索引。打開portaudio流時使用該索引。

相關問題