2011-06-14 6 views
0

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

을하지만) (waveInGetNumDevs에 대한 호출을 (윈 XP 홈을 실행하는 PC에서) 원격 데스크톱을 통해이 프로그램을 실행하기 위해 반환을 시도하는 경우 제로.

대신 waveInGetNumDevs(), waveInGetDevCaps() 및 waveInOpen()에 대한 호출을 RecordString() 함수에서 제거하고 대신 프로그램을 시작할 때이 함수를 한 번만 실행하십시오. (waveInClose()에 대한 호출도 RecordString()에서 제거되었습니다.) 이제 호스트 PC에서 프로그램을 시작하여 waveInOpen()을 성공적으로 호출하고 오디오 입력 장치 (HWAVEIN dev_handle)에 대한 핸들을 검색하면 프로그램이 시작됩니다. 그런 다음 원격 데스크톱 (프로그램이 실행되는 동안)을 통해이 호스트 PC에 액세스 할 수 있으며 RecordString() 함수는 여전히 정상적으로 작동합니다. 따라서 장치 핸들을 얻은 후에는 오디오 입력을 원격 데스크톱을 통해 사용할 수 있습니다. 문제는 핸들을 얻는 중입니다.

호스트 PC에서 로컬로 시작하지 않고 원격 데스크톱을 통해 전체 응용 프로그램을 실행할 수있는 방법이 있습니까? http://www.wikihow.com/Hear-Audio-from-the-Remote-PC-when-Using-Remote-Desktop

은 "옵션"버튼을 원격 데스크톱 클릭을 시작할 때 다음 "로컬 리소스"탭을 선택하고 "원격 컴퓨터 소리가" "남겨로 설정되어 있는지 확인하십시오

답변

0

나는에 대한 답변 덕분에 발견 원격 컴퓨터에서 ".

원격 데스크톱을 통해 실행할 때 질문에 표시된 원본 코드가 제대로 작동합니다.

관련 문제