C++ PortAudio示例代码问题
我想制作一个吉他特效程序,所以我尝试运行PortaudioAPI中的示例代码pa_fuzz.c 它在paWDMKS主机api上工作。但是,当我使用Behringer ucg 102(无lantency)连接吉他时,主机api更改为paMME,我得到错误代码1和消息:“未定义外部错误”。 在visual studio输出控制台中,我还收到大量消息,如:C++ PortAudio示例代码问题,c++,c,portaudio,C++,C,Portaudio,我想制作一个吉他特效程序,所以我尝试运行PortaudioAPI中的示例代码pa_fuzz.c 它在paWDMKS主机api上工作。但是,当我使用Behringer ucg 102(无lantency)连接吉他时,主机api更改为paMME,我得到错误代码1和消息:“未定义外部错误”。 在visual studio输出控制台中,我还收到大量消息,如: 'ConsoleApplication4.exe' (Win32): Unloaded 'C:\Windows\SysWOW64\SHCore.d
'ConsoleApplication4.exe' (Win32): Unloaded 'C:\Windows\SysWOW64\SHCore.dll'
'ConsoleApplication4.exe' (Win32): Unloaded 'C:\Windows\SysWOW64\shlwapi.dll'
'ConsoleApplication4.exe' (Win32): Unloaded 'C:\Windows\SysWOW64\shell32.dll'
'ConsoleApplication4.exe' (Win32): Unloaded 'C:\Windows\SysWOW64\dbgcore.dll'
'ConsoleApplication4.exe' (Win32): Unloaded 'C:\Program Files\Native Instruments\Rig Kontrol 3 Driver\asio\rig3asio32.dll'
下面是“PaHostErrorInfo”对象的代码段
以下是源代码:
#include <stdio.h>
#include <math.h>
#include "portaudio.h"
/*
** Note that many of the older ISA sound cards on PCs do NOT support
** full duplex audio (simultaneous record and playback).
** And some only support full duplex at lower sample rates.
*/
#define SAMPLE_RATE (8000)
#define PA_SAMPLE_TYPE paFloat32
#define FRAMES_PER_BUFFER (64)
typedef float SAMPLE;
float CubicAmplifier( float input );
static int fuzzCallback( const void *inputBuffer, void *outputBuffer,
unsigned long framesPerBuffer,
const PaStreamCallbackTimeInfo* timeInfo,
PaStreamCallbackFlags statusFlags,
void *userData );
/* Non-linear amplifier with soft distortion curve. */
float CubicAmplifier( float input )
{
float output, temp;
if( input < 0.0 )
{
temp = input + 1.0f;
output = (temp * temp * temp) - 1.0f;
}
else
{
temp = input - 1.0f;
output = (temp * temp * temp) + 1.0f;
}
return output;
}
#define FUZZ(x) CubicAmplifier(CubicAmplifier(CubicAmplifier(CubicAmplifier(x))))
static int gNumNoInputs = 0;
/* This routine will be called by the PortAudio engine when audio is needed.
** It may be called at interrupt level on some machines so don't do anything
** that could mess up the system like calling malloc() or free().
*/
static int fuzzCallback( const void *inputBuffer, void *outputBuffer,
unsigned long framesPerBuffer,
const PaStreamCallbackTimeInfo* timeInfo,
PaStreamCallbackFlags statusFlags,
void *userData )
{
SAMPLE *out = (SAMPLE*)outputBuffer;
const SAMPLE *in = (const SAMPLE*)inputBuffer;
unsigned int i;
(void) timeInfo; /* Prevent unused variable warnings. */
(void) statusFlags;
(void) userData;
if( inputBuffer == NULL )
{
for( i=0; i<framesPerBuffer; i++ )
{
*out++ = 0; /* left - silent */
*out++ = 0; /* right - silent */
}
gNumNoInputs += 1;
}
else
{
for( i=0; i<framesPerBuffer; i++ )
{
*out++ = FUZZ(*in++); /* left - distorted */
*out++ = *in++; /* right - clean */
}
}
return paContinue;
}
/*******************************************************************/
int main(void);
int main(void)
{
PaStreamParameters inputParameters, outputParameters;
PaStream *stream;
PaError err;
PaDeviceInfo *info;
err = Pa_Initialize();
if( err != paNoError ) goto error;
info = Pa_GetDeviceInfo(1);
inputParameters.device = Pa_GetDefaultInputDevice(); /* default input device */
if (inputParameters.device == paNoDevice) {
fprintf(stderr,"Error: No default input device.\n");
goto error;
}
inputParameters.channelCount = 2; /* stereo input */
inputParameters.sampleFormat = PA_SAMPLE_TYPE;
inputParameters.suggestedLatency = Pa_GetDeviceInfo( inputParameters.device )->defaultLowInputLatency;
inputParameters.hostApiSpecificStreamInfo = NULL;
info = Pa_GetDeviceInfo(4);
outputParameters.device = Pa_GetDefaultOutputDevice(); /* default output device */
if (outputParameters.device == paNoDevice) {
fprintf(stderr,"Error: No default output device.\n");
goto error;
}
outputParameters.channelCount = 2; /* stereo output */
outputParameters.sampleFormat = PA_SAMPLE_TYPE;
outputParameters.suggestedLatency = Pa_GetDeviceInfo( outputParameters.device )->defaultLowOutputLatency;
outputParameters.hostApiSpecificStreamInfo = NULL;
err = Pa_OpenStream(
&stream,
&inputParameters,
&outputParameters,
SAMPLE_RATE,
FRAMES_PER_BUFFER,
0, /* paClipOff, */ /* we won't output out of range samples so don't bother clipping them */
fuzzCallback,
NULL );
PaHostErrorInfo *err2 = Pa_GetLastHostErrorInfo();
printf(err2->errorText);
if( err != paNoError ) goto error;
err = Pa_StartStream( stream );
if( err != paNoError ) goto error;
printf("Hit ENTER to stop program.\n");
getchar();
err = Pa_CloseStream( stream );
if( err != paNoError ) goto error;
printf("Finished. gNumNoInputs = %d\n", gNumNoInputs );
Pa_Terminate();
return 0;
error:
Pa_Terminate();
fprintf( stderr, "An error occured while using the portaudio stream\n" );
fprintf( stderr, "Error number: %d\n", err );
fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) );
return -1;
}
#包括
#包括
#包括“portaudio.h”
/*
**请注意,PC上的许多旧ISA声卡不支持
**全双工音频(同时录制和播放)。
**有些仅支持低采样率的全双工。
*/
#定义抽样率(8000)
#定义PAU样本类型PA32
#为每个缓冲区定义帧(64)
typedef浮样;
浮点数输入;
静态int fuzzCallback(const void*inputBuffer,void*outputBuffer,
未签名的长帧缓冲,
const Pastream CallbackTimeInfo*timeInfo,
PaStreamCallbackFlags状态标志,
void*用户数据);
/*具有软失真曲线的非线性放大器*/
浮点输入(浮点输入)
{
浮子输出,温度;
如果(输入<0.0)
{
温度=输入+1.0f;
输出=(温度*温度*温度)-1.0f;
}
其他的
{
温度=输入-1.0f;
输出=(温度*温度*温度)+1.0f;
}
返回输出;
}
#定义FUZZ(x)CubicAmplifier(CubicAmplifier(x)))
静态int gNumNoInputs=0;
/*当需要音频时,PortAudio引擎将调用此例程。
**在某些机器上,它可能在中断级别被调用,所以不要做任何事情
**这可能会像调用malloc()或free()一样扰乱系统。
*/
静态int fuzzCallback(const void*inputBuffer,void*outputBuffer,
未签名的长帧缓冲,
const Pastream CallbackTimeInfo*timeInfo,
PaStreamCallbackFlags状态标志,
void*用户数据)
{
样本*输出=(样本*)输出缓冲区;
常量样本*输入=(常量样本*)输入缓冲区;
无符号整数i;
(void)timeInfo;/*防止未使用的变量警告*/
(作废)状态标志;
(作废)用户数据;
如果(inputBuffer==NULL)
{
对于(i=0;idefaultLowOutputLatency;
outputParameters.hostApiSpecificStreamInfo=NULL;
err=Pa_OpenStream(
&溪流,
&输入参数,
&输出参数,
抽样率,
每个缓冲区的帧数,
0、/*paClipOff、*/*我们不会输出超出范围的样本,因此不必费心剪裁它们*/
回拨,,
无效);
PaHostErrorInfo*err2=Pa_GetLastHostErrorInfo();
printf(err2->errertext);
如果(err!=paNoError)转到错误;
err=Pa_开始流(流);
如果(err!=paNoError)转到错误;
printf(“按回车键停止程序。\n”);
getchar();
err=Pa_CloseStream(流);
如果(err!=paNoError)转到错误;
printf(“Finished.gNumNoInputs=%d\n”,gNumNoInputs);
Pa_Terminate();
返回0;
错误:
Pa_Terminate();
fprintf(stderr,“使用portaudio流时出错\n”);
fprintf(标准,“错误号:%d\n”,错误);
fprintf(标准,“错误消息:%s\n”,Pa_GetErrorText(err));
返回-1;
}
你们能看看是什么问题吗?我已经安装了BEHRINGER USB WDM AUDIO 2.8.40驱动程序。(我使用这个USB接口和吉他装备)我切换到另一个USB端口,它工作了。我想这是portaudio的错误。我将在这里留下这个答案。现在我有另一个问题。延迟:(用延迟弹吉他太令人沮丧了。 延迟的原因是什么?我正在将我的吉他与behringer ucg102(以无延迟而闻名)连接。同样,我将它与吉他装备一起使用,我的延迟接近0。这是portaudio库的问题吗?此代码来自他们的示例“pa_fuzz.c”
新建编辑:通过选择所需的输入和输出设备修复延迟问题。请不要发布文本图像。按原样将文本复制并粘贴到帖子中。用于代码和错误。dll卸载发生在错误消息之前还是之后?卸载发生在Pa_Terminate()时;调用时,我将发布代码。我认为这不是问题所在
#include <stdio.h>
#include <math.h>
#include "portaudio.h"
/*
** Note that many of the older ISA sound cards on PCs do NOT support
** full duplex audio (simultaneous record and playback).
** And some only support full duplex at lower sample rates.
*/
#define SAMPLE_RATE (8000)
#define PA_SAMPLE_TYPE paFloat32
#define FRAMES_PER_BUFFER (64)
typedef float SAMPLE;
float CubicAmplifier( float input );
static int fuzzCallback( const void *inputBuffer, void *outputBuffer,
unsigned long framesPerBuffer,
const PaStreamCallbackTimeInfo* timeInfo,
PaStreamCallbackFlags statusFlags,
void *userData );
/* Non-linear amplifier with soft distortion curve. */
float CubicAmplifier( float input )
{
float output, temp;
if( input < 0.0 )
{
temp = input + 1.0f;
output = (temp * temp * temp) - 1.0f;
}
else
{
temp = input - 1.0f;
output = (temp * temp * temp) + 1.0f;
}
return output;
}
#define FUZZ(x) CubicAmplifier(CubicAmplifier(CubicAmplifier(CubicAmplifier(x))))
static int gNumNoInputs = 0;
/* This routine will be called by the PortAudio engine when audio is needed.
** It may be called at interrupt level on some machines so don't do anything
** that could mess up the system like calling malloc() or free().
*/
static int fuzzCallback( const void *inputBuffer, void *outputBuffer,
unsigned long framesPerBuffer,
const PaStreamCallbackTimeInfo* timeInfo,
PaStreamCallbackFlags statusFlags,
void *userData )
{
SAMPLE *out = (SAMPLE*)outputBuffer;
const SAMPLE *in = (const SAMPLE*)inputBuffer;
unsigned int i;
(void) timeInfo; /* Prevent unused variable warnings. */
(void) statusFlags;
(void) userData;
if( inputBuffer == NULL )
{
for( i=0; i<framesPerBuffer; i++ )
{
*out++ = 0; /* left - silent */
*out++ = 0; /* right - silent */
}
gNumNoInputs += 1;
}
else
{
for( i=0; i<framesPerBuffer; i++ )
{
*out++ = FUZZ(*in++); /* left - distorted */
*out++ = *in++; /* right - clean */
}
}
return paContinue;
}
/*******************************************************************/
int main(void);
int main(void)
{
PaStreamParameters inputParameters, outputParameters;
PaStream *stream;
PaError err;
PaDeviceInfo *info;
err = Pa_Initialize();
if( err != paNoError ) goto error;
info = Pa_GetDeviceInfo(1);
inputParameters.device = Pa_GetDefaultInputDevice(); /* default input device */
if (inputParameters.device == paNoDevice) {
fprintf(stderr,"Error: No default input device.\n");
goto error;
}
inputParameters.channelCount = 2; /* stereo input */
inputParameters.sampleFormat = PA_SAMPLE_TYPE;
inputParameters.suggestedLatency = Pa_GetDeviceInfo( inputParameters.device )->defaultLowInputLatency;
inputParameters.hostApiSpecificStreamInfo = NULL;
info = Pa_GetDeviceInfo(4);
outputParameters.device = Pa_GetDefaultOutputDevice(); /* default output device */
if (outputParameters.device == paNoDevice) {
fprintf(stderr,"Error: No default output device.\n");
goto error;
}
outputParameters.channelCount = 2; /* stereo output */
outputParameters.sampleFormat = PA_SAMPLE_TYPE;
outputParameters.suggestedLatency = Pa_GetDeviceInfo( outputParameters.device )->defaultLowOutputLatency;
outputParameters.hostApiSpecificStreamInfo = NULL;
err = Pa_OpenStream(
&stream,
&inputParameters,
&outputParameters,
SAMPLE_RATE,
FRAMES_PER_BUFFER,
0, /* paClipOff, */ /* we won't output out of range samples so don't bother clipping them */
fuzzCallback,
NULL );
PaHostErrorInfo *err2 = Pa_GetLastHostErrorInfo();
printf(err2->errorText);
if( err != paNoError ) goto error;
err = Pa_StartStream( stream );
if( err != paNoError ) goto error;
printf("Hit ENTER to stop program.\n");
getchar();
err = Pa_CloseStream( stream );
if( err != paNoError ) goto error;
printf("Finished. gNumNoInputs = %d\n", gNumNoInputs );
Pa_Terminate();
return 0;
error:
Pa_Terminate();
fprintf( stderr, "An error occured while using the portaudio stream\n" );
fprintf( stderr, "Error number: %d\n", err );
fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) );
return -1;
}