UWP: waveInOpen возвращает WAVERR_BADFORMAT

Я пытаюсь записать звук в UWP с помощью Winmm.dll. После выполнения метода waveInOpen (https://msdn.microsoft.com/en-us/library/dd743847(v=vs.85).aspx) Я всегда получаю WAVERR_BADFORMAT независимо от того, какие данные я использую (это также занимает много времени, около 5 секунд). Мой код выглядит следующим образом:

Рекордер.cs:

Win32.WAVEFORMATEX waveFormatEx = new Win32.WAVEFORMATEX();
                waveFormatEx.wFormatTag = (ushort)Win32.WaveFormatFlags.WAVE_FORMAT_PCM;
                waveFormatEx.nChannels = 1;
                waveFormatEx.nSamplesPerSec = 8000;
                waveFormatEx.wBitsPerSample = 16;
                waveFormatEx.nBlockAlign = 2;
                waveFormatEx.nAvgBytesPerSec = 16000;

                Win32.MMRESULT hr = Win32.waveInOpen(ref hWaveIn, deviceId, ref waveFormatEx, delegateWaveInProc, 0, (int)Win32.WaveProcFlags.CALLBACK_FUNCTION);

Win32.cs:

[StructLayout(LayoutKind.Sequential)]
    public struct WAVEFORMATEX
    {
        public ushort wFormatTag;
        public ushort nChannels;
        public uint nSamplesPerSec;
        public uint nAvgBytesPerSec;
        public ushort nBlockAlign;
        public ushort wBitsPerSample;
        public ushort cbSize;
    }
[DllImport("winmm.dll")]
        public static extern MMRESULT waveInOpen(ref IntPtr hWaveIn, int deviceId, ref WAVEFORMATEX wfx, DelegateWaveInProc dwCallBack, int dwInstance, int dwFlags);

Тот же код с теми же параметрами прекрасно работает в приложении Windows Forms (и выполняется за доли секунды), но в приложении UWP этого не происходит, и я понятия не имею, почему. Какой правильный формат я мог бы использовать в UWP?


person Michał Dutka    schedule 12.02.2018    source источник
comment
Вы понимаете, что WinForms и UWP сильно отличаются, верно? Простой поиск в Google привел меня к этому code.msdn.microsoft. com/windowsapps/ взгляните   -  person Alex    schedule 12.02.2018
comment
@ Алекс Да, я знаю, что они разные. И я уже видел эту ссылку. Я просто хотел бы знать, как/могу ли я использовать эту dll для этого (это работает для воспроизведения звука).   -  person Michał Dutka    schedule 12.02.2018


Ответы (1)


При работе с проектами UWP следует помнить: это ограниченный набор функций (в целях безопасности и совместимости между устройствами). Итак, проект UWP не имеет ничего общего с Win32 API. И даже если ваш код компилируется/запускается на эмуляторе, он будет:

  • Сбой на устройствах ARM (поскольку у них точно нет Win32 DLL)
  • Сбой при отправке приложения в Microsoft Store

Итак, если мы говорим именно об аудио, вы должны рассмотреть WASAPI, поскольку он на 100% совместим с UWP https://msdn.microsoft.com/en-us/library/windows/desktop/dd371455(v=vs.85).aspx

person Yury Schkatula    schedule 12.02.2018