Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用portaudio将多音频铃声传送到声卡_Audio_Portaudio - Fatal编程技术网

使用portaudio将多音频铃声传送到声卡

使用portaudio将多音频铃声传送到声卡,audio,portaudio,Audio,Portaudio,我正在尝试为声卡生成音调(频率:1950 hz,持续时间:40 ms,音量:-30 db,右声道(立体声),在steam 1上)。最后,我想播放其中的两个音调(一个去通道1,一个去通道2) 非常感谢任何帮助或指导 谢谢, DW 嗨,比约恩,我试过这个,但我没有得到我期望的频率(加上似乎声音不干净)。你知道怎么了吗? 我非常感谢任何帮助 #define SAMPLE_RATE (44100) #define TABLE_SIZE (200) float FREQUENCY = 422;

我正在尝试为声卡生成音调(频率:1950 hz,持续时间:40 ms,音量:-30 db,右声道(立体声),在steam 1上)。最后,我想播放其中的两个音调(一个去通道1,一个去通道2)

非常感谢任何帮助或指导

谢谢, DW



嗨,比约恩,我试过这个,但我没有得到我期望的频率(加上似乎声音不干净)。你知道怎么了吗? 我非常感谢任何帮助

#define SAMPLE_RATE   (44100)
#define TABLE_SIZE   (200)
float FREQUENCY = 422;

...
for(int i=0; i<TABLE_SIZE; i++ )
{
    data.sine[i] = (float) sin( (double)i * ((2.0 * M_PI)/(double)SAMPLE_RATE) * FREQUENCY );
}

data.left_phase = 0;
data.right_phase = 0;
...

... in callback function ...
for(unsigned long i = 0; i < framesPerBuffer; i++ )
{   

  // fill output buffer with sin wave
  *out++ = data->amp * data->sine[data->left_phase];  // left     
  *out++ = data->amp * data->sine[data->right_phase]; // right                  

  data->left_phase += 1;    

  if( data->left_phase >= TABLE_SIZE ) 
    data->left_phase -= TABLE_SIZE;           

  data->right_phase += 1; 

  if( data->right_phase >= TABLE_SIZE ) 
    data->right_phase -= TABLE_SIZE;
} 
#定义采样率(44100)
#定义表格大小(200)
浮动频率=422;
...
对于(int i=0;iamp*数据->正弦[数据->左相位];//左
*out++=data->amp*data->正弦[数据->右相位];//右
数据->左相位+=1;
如果(数据->左\u阶段>=表格大小)
数据->左\相-=表\大小;
数据->右相位+=1;
如果(数据->右\u阶段>=表格大小)
数据->右\u阶段-=表格大小;
} 

PortAudio提供了生成音调的示例代码,您只需计算出频率。例如,请参见以下答案:

更新:

不要试图存储正弦数据表,只需使用以下公式计算回调中的正弦值:

振幅[n]=sin(n*desiredFreq*2*pi/采样器)

因此(未经测试)您的代码将如下所示:

typedef struct
{
    long n;
} MyData;

float FREQUENCY = 422;

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

    (void) timeInfo; /* Prevent unused variable warnings. */
    (void) statusFlags;
    (void) inputBuffer;     

    for(unsigned long i = 0; i < framesPerBuffer; i++ )
    {               
        // fill output buffer with sin wave
        float v = sin( data->n * FREQUENCY * 2 * PI / (float) SAMPLERATE )
        *out++ = v; // left         
        *out++ = v; // right
    }   

    return paContinue;
}
typedef结构
{
长n;
}我的数据;
浮动频率=422;
静态int MyCallback(
常量无效*输入缓冲区,
void*outputBuffer,
未签名的长帧缓冲,
const Pastream CallbackTimeInfo*timeInfo,
PaStreamCallbackFlags状态标志,
void*用户数据
)
{   
MyData*数据=(MyData*)用户数据;
浮点*输出=(浮点*)输出缓冲区;
(void)timeInfo;/*防止未使用的变量警告*/
(作废)状态标志;
(void)输入缓冲区;
for(无符号长i=0;in*频率*2*PI/(浮点数)采样器)
*out++=v;//左
*out++=v;//对
}   
返回继续;
}

这段代码并非没有问题:例如,最终n将“环绕”我不确定sin是否会随着输入的增大而保持准确和高效。尽管如此,这是一个很好的起点,如果你只需要在现代硬件上生成几秒钟的音调,这就是你真正需要的。如果你需要更华丽的东西,先让它工作起来,然后你就可以担心如何让它更高效、更健壮一个LUT。

嗨,比约恩,我试过这个,但我没有得到我期望的频率(加上声音似乎不干净).有什么想法吗?我非常感谢您的帮助。请参阅上面的代码。我想您可能会对使用该表感到困惑。该表只是用于优化。为什么不从使用sin函数在回调中生成音调开始呢?Bjorn,这就是我混合数据表的问题,它是一个优化,并且回调中的数据正确。你建议直接在回调中工作,这就成功了。再次感谢。顺便说一句,在我发布其他帖子之前,我没有看到你的回复。大卫。很高兴它成功了!也许你可以将我的答案标记为正确的眨眼眨眼推移:)