2012-10-21 6 views
3

저는 다양한 장치에서 녹음 및 재생이 가능한 프로그램 용 오디오 코드를 개발 중입니다. 이들 중 일부는 다양한 wav 및 AIFF 형식으로 제공됩니다. WASAPI 라이브러리를 사용할 수 있기를 기대했지만, 몇 가지 중대한 문제가 발생했습니다. 지금 당장 가능한 가장 큰 점은 내가 알 수있는 한 장치는 정확히 일치하는 형식의 스트림 만 재생할 수 있다는 것입니다. 그런 다음WASAPI 문제

hr = pPlaybackDevice->Activate(__uuidof(IAudioClient), CLSCTX_ALL, NULL, (void**)&pTakeAudioClient); 

: 내가 가진 장치를 활성화

hr = pEnumerator->GetDefaultAudioEndpoint(eRender, eConsole, &pPlaybackDevice); 

: 여기

내가 가진 장치 (여기 난 그냥 기본 콘솔 장치를 얻고있다)를 설정하는 것은 - 난 무엇 다음과 같이 믹스 형식을 확인합니다 :

그러나 초기화 할 때 다른 형식을 사용하는 경우 :

hr = pTakeAudioClient->Initialize(AUDCLNT_SHAREMODE_SHARED, AUDCLNT_STREAMFLAGS_EVENTCALLBACK | AUDCLNT_STREAMFLAGS_NOPERSIST,hnsRequestedDuration, 0, pAnotherWaveFormatEx,NULL); 

오류가 발생했습니다. 파일이 절대적으로 GetMixFormat에 의해 반환 된 형식이어야한다는 것 같습니다. 내가 제출할 수 있습니다 어떤 형식 알아 IsFormatSupported를 호출하는 경우 :

hr = pTakeAudioClient->IsFormatSupported(AUDCLNT_SHAREMODE_SHARED, &waveFormatEx, &pAnotherWaveFormatEx); 

을 둘 다 구조가 동일하더라도, E_INVALIDARG를 얻을. WASAPI 문서에 따르면, "매개 변수 ShareMode가 AUDCLNT_SHAREMODE_SHARED 또는 AUDCLNT_SHAREMODE_EXCLUSIVE이 아닌 다른 값일 때 리턴됩니다." 나는 AUDCLNT_SHAREMODE_SHARED을 전달하고있다. 이것은 설명서의 오류 인 것 같습니다.

신비는 실험을 위해, 내가하려고 할 때, 깊어 :

hr = pTakeAudioClient->IsFormatSupported(AUDCLNT_SHAREMODE_EXCLUSIVE, &waveFormatEx, NULL); 

오류 반환 0x8889000e입니다 - 내가 그 오류에 대한 참조를 찾을 수 없어. 제공 할 수있는 도움이 "MMSystem 사용"인 경우에도 가장 감사하게 접수됩니다. 여러 장치가있을 때 재생 장치를 제어 할 수 있어야한다는 것을 제외하고는 MMSystem으로 시작했을 것입니다.

답변

1

0x8889000e = AUDCLNT_E_EXCLUSIVE_MODE_NOT_ALLOWED (HRESULT reading utility)이 이유는 거의 예외적인데,이 형식은 단독 모드 오디오 클라이언트에서는 사용할 수 없습니다. 아마도 독점적 일 필요는 없지만 공유 모드로 충분할 수 있습니다. 어쨌든 WASAPI를 통해 녹음하고 재생하려면 일반적으로 PCM 오디오 형식 중 하나 인 하드웨어가 지원하는 형식을 협상해야합니다.

여러 형식으로 변환하려면 여러 가지 API가 있어야합니다 (ACM, DirectShow, Media Foundation). DirectShow 및 Media Foundation과 같은 일부 API는 재생 된 데이터를 지원되는 형식으로 자동 변환하고 오디오 장치를 통해 다시 재생할 수 있습니다.

1

나는 이것이 매우 오래된 스레드라는 것을 알고 있지만이 옵션은 분명히 개선되었지만이 옵션은 질문이있을 때 사용 가능할 수도 있지만 확실하지는 않습니다. , 일반적으로별로 도움이되지 않습니다).

어쨌든 내 경험상 표준 PCM 오디오를 사용한다고 가정 할 때 중요한 요소는 요청한 샘플링 속도 인 것 같습니다. 대부분의 사운드 카드는이 점에서 "믹스 형식"(이것은 공유 오디오 모드 용)에서보고 된 것과 다른 점을 허용하지 않습니다. 따라서 카드의 샘플링 속도를 받아 들여 가능한 모든 샘플링 속도로 보낼 수도 있고 필요에 따라 출력 체인에 변환기를 삽입하도록 오디오 드라이버에 요청할 수도 있습니다.

가장 쉬운 방법은 Initialize() 호출을 발행 할 때 AUDCLNT_STREAMFLAGS_AUTOCONVERTPCM 플래그를 사용하는 것입니다.이 플래그는 내가 말한 것을 수행하고 요청한 소스 오디오 형식을 지원되는 장치 형식으로 변환합니다. IAudioClockAdjustment::SetSampleRate을 사용하여 SR을 즉시 변경할 수도 있지만 직접 해보지 않았습니다. 자세한 내용은 this page의 다른 플래그를 확인하십시오.