Captured audio buffers are all silent on Windows Phone 8

我的梦境 提交于 2019-12-14 03:52:58

问题


I'm trying to capture audio using WASAPI. My code is largely based on the ChatterBox VoIP sample app. I'm getting audio buffers, but they are all silent (flagged AUDCLNT_BUFFERFLAGS_SILENT).

I'm using Visual Studio Express 2012 for Windows Phone. Running on the emulator.


回答1:


I had the exact same problem and managed to reproduce it in the ChatterBox sample app if I set Visual Studio to native debugging and at any point stepped through the code.

Also, closing the App without going through the "Stop" procedure and stopping the AudioClient will require you to restart the emulator/device before being able to capture audio data again.

It nearly drove me nuts before I figured out the before mentioned problems but I finally got it working.

So.. 1. Be sure to NOT do native debugging 2. Always call IAudioClient->Stop(); before terminating the App. 3. Make sure you pass the correct parameters to IAudioClient->Initialize();

I've included a piece of code that works 100% of the time for me. I've left out error checking for clarity..

LPCWSTR pwstrDefaultCaptureDeviceId =
  GetDefaultAudioCaptureId(AudioDeviceRole::Communications);
HRESULT hr = ActivateAudioInterface(pwstrDefaultCaptureDeviceId,
  __uuidof(IAudioClient2), (void**)&m_pAudioClient);
hr = m_pAudioClient->GetMixFormat(&m_pwfx);
m_frameSizeInBytes = (m_pwfx->wBitsPerSample / 8) * m_pwfx->nChannels;
hr = m_pAudioClient->Initialize(AUDCLNT_SHAREMODE_SHARED,
  AUDCLNT_STREAMFLAGS_NOPERSIST | AUDCLNT_STREAMFLAGS_EVENTCALLBACK, 
  latency * 10000, 0, m_pwfx, NULL);
hr = m_pAudioClient->SetEventHandle(m_hCaptureEvent);
hr = m_pAudioClient->GetService(__uuidof(IAudioCaptureClient),
  (void**)&m_pCaptureClient);

And that's it.. Before calling this code I've started a worker thread that will listen to m_hCaptureEvent and call IAudioCaptureClient->GetBuffer(); whenever the capture event is triggered.

Of course using Microsoft.XNA.Audio.Microphone works fine to, but it's not always an option to reference the XNA framework.. :)




回答2:


It was a really annoying problem which waste about 2 complete days of mine.My problem was solved by setting AudioClientProperties.eCatagory to AudioCategory_Communications instead of AudioCategory_Other.

After this long try and error period I am not sure that the problem won't repeat in the future because the API doesn't act very stable and every run may return a different result.

Edit:Yeah my guess was true.Restarting the wp emulator makes the buffer silent again.But changing the AudioClientProperties.eCatagory back to AudioCategory_Other again solve it.I still don't know what is wrong with it and what is the final solution.

Again I encounter the same problem and this time commenting (removing) the properties.eCategory = AudioCategory_Communications; solve the problem.




回答3:


I can add my piece of advice for Windows Phone 8.1. I made the following experiment.

  1. Open capture device. Buffers are not silent.
  2. Open render device with AudioDeviceRole::Communications. Buffers immediately go silent.
  3. Close render device. Buffers are not silent.

Then I opened capture device with AudioDeviceRole::Communications and capture device works fine all the time.

For Windows 10 capture device works all the time, no matter if you open it with AudioDeviceRole::Communications or not.




回答4:


I've had the same problem. It seems like you can either use only AudioCategory_Other or create an instance of VoipPhoneCall and use only AudioCategory_Communications.

So the solution in my case was to use AudioCategory_Communications and create an outgoing VoipPhoneCall. You should implement the background agents as in Chatterbox VoIP sample app for the VoipCallCoordinator to work .



来源:https://stackoverflow.com/questions/14796877/captured-audio-buffers-are-all-silent-on-windows-phone-8

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!