使用portaudio将多音频铃声传送到声卡
我正在尝试为声卡生成音调(频率:1950 hz,持续时间:40 ms,音量:-30 db,右声道(立体声),在steam 1上)。最后,我想播放其中的两个音调(一个去通道1,一个去通道2) 非常感谢任何帮助或指导 谢谢, DW使用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;
嗨,比约恩,我试过这个,但我没有得到我期望的频率(加上似乎声音不干净)。你知道怎么了吗? 我非常感谢任何帮助
#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,这就是我混合数据表的问题,它是一个优化,并且回调中的数据正确。你建议直接在回调中工作,这就成功了。再次感谢。顺便说一句,在我发布其他帖子之前,我没有看到你的回复。大卫。很高兴它成功了!也许你可以将我的答案标记为正确的眨眼眨眼推移:)