C++ PortAudio示例代码问题

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

我想制作一个吉他特效程序,所以我尝试运行PortaudioAPI中的示例代码pa_fuzz.c

它在paWDMKS主机api上工作。但是,当我使用Behringer ucg 102(无lantency)连接吉他时,主机api更改为paMME,我得到错误代码1和消息:“未定义外部错误”。 在visual studio输出控制台中,我还收到大量消息,如:

'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;
}