我正在编写一个应用程序,在Borland Turbo C++(2006)中运行,并且在Windows XP Pro下运行,我想从音频输入记录到数据缓冲区中,以便随后可以FFT时间响应。如何从通过远程桌面访问的PC的音频输入录制?

当应用程序在本地运行下面的代码工作正常:

short int pluck_data[T_SAMPLES][CHANNELS];

//---------------------------------------------------------------------------

int __fastcall CheckResult(char* func_name, int result)

{

int return_value = 1; // set return_value for fail by default

char msg[100];

if(result == MMSYSERR_NOERROR) // function call returned without error

return_value = 0;

else // function call returned error

{

switch(result)

{

case MMSYSERR_ALLOCATED:

sprintf(msg, "%s: Specified resource is already allocated.", func_name);

break;

case MMSYSERR_BADDEVICEID:

sprintf(msg, "%s: Specified device identifier is out of range.", func_name);

break;

case MMSYSERR_INVALHANDLE:

sprintf(msg, "%s: Specified device handle is invalid.", func_name);

break;

case MMSYSERR_NODRIVER:

sprintf(msg, "%s: No device driver is present.", func_name);

break;

case MMSYSERR_NOMEM:

sprintf(msg, "%s: Unable to allocate or lock memory.", func_name);

break;

case WAVERR_BADFORMAT:

sprintf(msg, "%s: Attempted to open with an unsupported waveform-audio format.", func_name);

break;

case WAVERR_STILLPLAYING:

sprintf(msg, "%s: The buffer pointed to by the pwh parameter is still in the queue.", func_name);

break;

case WAVERR_UNPREPARED:

sprintf(msg, "%s: The buffer pointed to by the pwh parameter hasn't been prepared.", func_name);

break;

default:

sprintf(msg, "%s: Unknown error.", func_name);

}

ReportError(hWnd, msg, log_fptr);

} // else function call returned error

return return_value;

}

//---------------------------------------------------------------------------

int __fastcall RecordString()

{

int return_value = 1; // set return_value for fail by default

WAVEINCAPS dev_capability;

HWAVEIN dev_handle;

WAVEFORMATEX rec_format;

WAVEHDR rec_header;

int result;

char msg[100];

result = waveInGetNumDevs(); // get number of audio input devices

if(result != 1)

{

if(result == 0)

sprintf(msg, "No waveform-audio input devices present.");

else

sprintf(msg, "More than one waveform-audio input device present.");

ReportError(hWnd, msg, log_fptr);

}

else

{

// only 1 audio input device; test its capabilities

result = waveInGetDevCaps(0,&dev_capability,sizeof(dev_capability));

if(CheckResult("waveInGetDevCaps", result) == 0)

{

// test if device supports 96kHz, Stereo, 16-bit format WAVE_FORMAT_96S16

if ((dev_capability.dwFormats & WAVE_FORMAT_96S16) == 0)

{

sprintf(msg, "waveInGetDevCaps: WAVE_FORMAT_96S16 not supported");

ReportError(hWnd, msg, log_fptr);

}

else

{

// initialise required record format

rec_format.wFormatTag = WAVE_FORMAT_PCM;

rec_format.nChannels = CHANNELS; // 2

rec_format.nSamplesPerSec = SAMPLE_RATE; // 96000

rec_format.nAvgBytesPerSec = BYTES_PER_SAMPLE * SAMPLE_RATE; // 384000

rec_format.nBlockAlign = BYTES_PER_SAMPLE; // 4

rec_format.wBitsPerSample = SAMPLE_BITS; // 16

rec_format.cbSize = 0;

// open audio input device requesting format 96kHz, Stereo, 16-bit

result = waveInOpen(&dev_handle, WAVE_MAPPER, &rec_format, 0, 0, 0);

if(CheckResult("waveInOpen", result) == 0)

{

// initialise header for data buffer

rec_header.lpData = (char*)&pluck_data;

rec_header.dwBufferLength = sizeof(pluck_data);

rec_header.dwFlags = 0;

// prepare header for data buffer

result = waveInPrepareHeader(dev_handle, &rec_header, sizeof(rec_header));

if(CheckResult("waveInPrepareHeader", result) == 0)

{

// connect data buffer to audio input device

result = waveInAddBuffer(dev_handle, &rec_header, sizeof(rec_header));

if(CheckResult("waveInAddBuffer", result) == 0)

{

// start recording

result = waveInStart(dev_handle);

if(CheckResult("waveInStart", result) == 0)

{

// recording - poll flag until data buffer full

while((rec_header.dwFlags & WHDR_DONE) == 0); // wait for flag to be set

// buffer now full

// reset/stop recording

result = waveInReset(dev_handle);

if(CheckResult("waveInReset", result) == 0)

{

// unprepare header for data buffer

result = waveInUnprepareHeader(dev_handle, &rec_header, sizeof(rec_header));

if(CheckResult("waveInUnprepareHeader", result) == 0)

{

// close audio input device

result = waveInClose(dev_handle);

if(CheckResult("waveInClose", result) == 0)

return_value = 0;

}

}

}

}

}

}

}

}

}

return return_value;

}

但是,如果我尝试运行通过远程桌面这个程序(从运行Windows XP家庭版的PC机)的调用waveInGetNumDevs()返回零。

作为一种替代,我从RecordString()函数中删除了对waveInGetNumDevs(),waveInGetDevCaps()和waveInOpen()的调用,而在程序启动时只运行一次。 (对waveInClose()的调用也从RecordString()中移除。)现在,如果我在主机PC上启动程序,以便它已成功调用waveInOpen()并检索到音频输入设备(HWAVEIN dev_handle)的句柄,然后,我可以通过远程桌面切换到访问此主机PC(程序仍在运行时),并且RecordString()函数仍然正常工作。因此,一旦获得设备句柄,看起来音频输入可通过远程桌面获得;问题在于处理。

有没有一种方法可以通过远程桌面运行整个应用程序,而不必在主机PC上本地启动它?

2011-06-14

Nicolas

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐