2013-02-13 80 views
0

我无法在PortAudio中生成特定频率,每当我尝试更改sin(n * FREQ * 2 * PI/SAMPLE_RATE)内部的频率时,频率保持不变,但声音似乎在音质上有所变化,较高频率值我把这个声音放在那里,但频率相同。这是我在我的patestCallback循环:使用PortAudio生成正弦波播放中间C

static int patestCallback(const void *inputBuffer, void *outputBuffer, 
          unsigned long framesPerBuffer, 
          const PaStreamCallbackTimeInfo *timeInfo, 
          PaStreamCallbackFlags statusFlags, 
          void *userData) 
{ 
    paTestData *data = (paTestData*)userData; 
    float *out = (float*)outputBuffer; 

    (void) timeInfo; 
    (void) statusFlags; 
    (void) inputBuffer; 
    unsigned long n = 0; 
    for(unsigned long i = 0; i<framesPerBuffer;i++,n++){ 
     float v = sin (261.626 * 2 * M_PI * ((float) n/(float) TABLE_SIZE)); 
     *out++ = v; 
     *out++ = v; 
    } 

    return paContinue; 
} 

回答

2

简单的解决方案:

static unsigned long n = 0; 

您目前重置n在每个函数调用,从而导致点击在开始每个新的缓冲区,并把这些你会听到难听的声音。正弦波的周期与缓冲区长度越长,它听起来越丑。

+1

此建议应该起作用(+1)。另一个解决方案可能是使userData的n部分。这可能会更好,如果你需要重置它外部或最终多个回调或类似的东西。 – 2013-02-13 14:50:40

+0

当然可以。理想情况下,userData将是一个包含实际音频引擎状态的结构或类。 – 2013-02-13 15:19:24

+0

好吧,我把它全部放在一个结构体中,它的功能非常好,谢谢!...我认为我在概念化portaudio的工作方式时遇到了困难,那么在每个framesPerBuffer循环之后它会不断调用patestCallback?另外,是否有可能在输出中写入3或4个正弦波,这样我就可以和弦了? – 2013-02-13 20:29:21