Commit graph portaudio/src/hostapi/wasapi/pa_win_wasapi.c
Author SHA1 Message Date
dmitrykos
4e194eaecf wasapi: support for setting the WASAPI's AudioClientProperties options via PaWasapiStreamInfo struct (__IAudioClient2_INTERFACE_DEFINED__ must be defined by Windows SDK (for Windows 8 and up) to have effect from these new options, otherwise it will be noop) 2015-10-19 11:03:31 +00:00
robiwan
3438e46e74 Minor refactoring to remove some warnings 2012-06-29 11:44:12 +00:00
dmitrykos
4ae4fa0ef9 wasapi: provide meaningful error code when opening the stream and error occurred instead of just paInvalidDevice 2012-04-16 08:16:20 +00:00
dmitrykos
5701b05e0f wasapi: zero wasapi host api rep immediately after init. prevents (unlikely) issue with trying to free uninited allocations if com init fails during Pa_Initialize() (Ross Bencina) 2012-04-02 12:25:14 +00:00
dmitrykos
341eb04550 wasapi:
- fixed possible buffer overrun inside WASAPI for Output poll-driven mode according ticket #196 (thanks to Ross Bencina for spotting this and proposing the solution)
2012-02-16 15:02:08 +00:00
dmitrykos
9bc432b603 wasapi:
- fixed device name incorrect in case it contains non-Latin characters (thanks to Robert Bielik for proposed solution), now it is converted to UTF-8 encoded string
- fixed damaged audio (pops & clicks) for Input exclusive event-driven mode if specified latency was below 23 ms
2012-02-16 14:49:28 +00:00
rossb
52ab9d6600 refactored COM initialization for dsound, asio and wasapi to new source file pa_win_coinitialize.c. fixes com uninitialisation bugs in error cases. resolves ticket #128 2011-05-09 20:05:34 +00:00
rossb
cbd24dc45c renamed PaUtil_GetBufferProcessorInputLatency to PaUtil_GetBufferProcessorInputLatencyFrames and PaUtil_GetBufferProcessorOutputLatency to PaUtil_GetBufferProcessorOutputLatencyFrames. see ticket #161 2011-05-02 17:07:11 +00:00
dmitrykos
ff61de145b wasapi:
- fixed warning of incompatible type usage when ring-buffer is used for blocking interface
 - fixed compilation using MSYS with MinGW compiler (regenerate makefile with configure)
2011-03-08 17:20:07 +00:00
dmitrykos
3fb0ef9e30 wasapi: fixed the bug when on stream stop/start/stop/start sequence callback could be called with number of samples smaller than requested by user in Pa_OpenStream 2011-02-21 22:41:06 +00:00
dmitrykos
f588f3cd5d wasapi: - releasing Input/Output buffer if error occurred inside the processing routine 2011-02-03 15:37:12 +00:00
dmitrykos
2b0faea85c wasapi:
- fixed blocking interface, Input and Output
 - improved Exclusive Input device latency tunning
 - applied path provided by Jean-François Charron (D-BOX Technologies Inc.) which improves handling of COM objects in multi-threaded environment and initialization stage which could under certain conditions return paNoError event when initialization failed
2011-02-03 15:15:44 +00:00
dmitrykos
272adbefc7 wasapi: allow mono input/output streams be created when Blocking interface is used. Thanks to Chris (c319chris@aol.com) for providing the patch. 2011-01-03 18:33:32 +00:00
dmitrykos
8b6f0610b6 wasapi: fixed audio device not released to other applications if WASAPI Exclusive stream is stopped but not yet closed. Bug does not affect Shared mode streams. Fixed possible object's leakage in situation when WASAPI thread encountered an error and stopped and user decided to start stream again without prior closing it. 2010-12-26 16:36:52 +00:00
dmitrykos
41645b30d5 wasapi: fixed audio gain is decreased by 2 when audio stream is opened for capturing and 1 (Mono) channel selected, this bug occurs only if non-Stereo input source used (mono mic). 2010-12-26 16:17:56 +00:00
dmitrykos
f1e8193ae1 wasapi:
- using WAVE_FORMAT_PCM for mono/stereo 8/16-bit stream configuration to avoid possible driver refusal upon audio client creation
 - modified default speaker mask for 5.1 and 7.1 configuration to _SURROUND (correct) versions, added default speaker configuration for 2.1, 4.1, 6.1 cases
2010-11-07 08:23:51 +00:00
dmitrykos
7b3d837bbb wasapi: fixed audio stream failing to open on Windows 7 in Exclusive mode if suggestedLatency parameter is 0 and user framesPerBuffer is less than 3 milliseconds 2010-11-06 01:16:34 +00:00
dmitrykos
e5b04a89da wasapi: fixed capturing (Input stream) if Polling mode is used, ProcessInputBuffer was broken erroneously returning AUDCLNT_S_BUFFER_EMPTY and thus breaking Input thread. 2010-10-20 17:32:04 +00:00
dmitrykos
738b8ad327 wasapi: improved audio quality stability in Shared mode if framesPerBuffer (from user-side) value is lower than 10 milliseconds, now even 1 frame provides stable quality. Exclusive mode is also affected by this improvement. 2010-10-20 17:00:54 +00:00
dmitrykos
52a9ce20ad wasapi:
- fixed compile under MinGW64 compiler (gcc version 4.5.1 20100702)
 - cleaned portability typedefs, thanks to MinGW64 project added KS headers which also work well for MinGW32 (tested: gcc version 4.5.0)
wdmks:
 - made it possible to use additional WDM/KS info for WMME/DS back-ends by defining PAWIN_USE_WDMKS_DEVICE_INFO for compilation by MinGW32/64 compilers if you include modified headers located in '\src\hostapi\wasapi\mingw-include'
2010-08-24 17:44:00 +00:00
dmitrykos
9c7974c76c wasapi:
- fixed alignment missing for host buffer if overall buffer size was set to less than 3ms that results in device timeout
 - advanced Event driven mode and extended the range of host buffer size which can operate in this mode up up to 20.66 ms, e.g. your device buffer size will vary in range 3 - 20.66 ms, if goes above then Poll driven mode is switched on automatically
2010-08-06 20:25:07 +00:00
dmitrykos
24c304db21 wasapi:
- fixed compilation by MinGW, was failing due to double ambiguous jack describing enums used in KS
ds:
 - fixed compile by MinGW, was failing due to missing casts to LPVOID * and usage of UINT instead of DWORD by PaWinDsStream::previousPlayCursor
2010-08-03 21:02:52 +00:00
dmitrykos
f2badb7725 wasapi:
- added functionality to enumerate jacks and their description
 - added example which demonstrates jacks enumeration technique
Thanks Reid Bishop for providing the idea for this extended functionality and patch with implementation.
2010-07-23 10:04:03 +00:00
dmitrykos
e540964ffc wasapi: - fixed frames preloading for buffer mode - paUtilFixedHostBufferSize 2010-07-20 21:01:07 +00:00
dmitrykos
3ba45b5966 wasapi: - fixed occasional bug (affects Windows 7 mostly) which is related to stream start failure due to exceeding buffer size when preloading data for output stream in exclusive mode (thanks Ralph Irving for noticing and reporting this bug) 2010-07-20 19:01:17 +00:00
dmitrykos
f6d6f4e955 wasapi:
- fixed usage of uninitialized variable (Input)
2010-07-15 23:27:21 +00:00
dmitrykos
a243ad431c wasapi:
- reimplemented full-duplex processing to address changes to latency calculations (please note Exclusive mode due to some unknown reason will likely not be able to provide good audio quality yet)
 - fixed Pa_GetStreamInfo for WASAPI device if stream is opened as full-duplex (thanks to Reid Bishop for pointing to the bug)
2010-07-12 18:41:05 +00:00
dmitrykos
231eb48512 wasapi:
- fixed memory corruption if format is set to non-interlieved and mono <> stereo mini-mixer is used for to convert mono to stereo (conversion is done due to WASAPI limitation)
 - made WASAPI fully passing patest_wire.c (full-duplex combinations) for shared and exclusive modes
 - if WASAPI device failed to open due to unsupported format it will not crash top PA layer anymore
 - improved full-duplex mode for shared/exclusive (although exclusive full-duplex mode still produces audio glitches due to difference in input/output device buffer size due to unknown WASAPI reason, with shared mode all is ok)
 - exclusive mode will now work with 1 channel audio always, even if it is not supported by WASAPI natively (we use own mono <> stereo mini-mixer)
2010-07-09 23:57:51 +00:00
dmitrykos
f7ee62732e wasapi:
- fixed Exclusive/Event mode if latency used exceeds 100ms resulting in bad audio
 - fixed Exclusive mode if overall stream latency exceeds 1400-2000ms resulting in E_OUTOFMEMORY even under Vista, now PA WASAPI will gradually decrease overall latency until acceptable level
 - applied device period aligning if period was corrected
 - improved robustness of audio client creation
2010-07-08 21:03:08 +00:00
dmitrykos
0a4cf33379 wasapi:
- reimplemented suggestedLatency and framesPerBuffer parameters in Pa_OpenStream call to opearate by the following formula - 'hostBufferFrames = userFramesPerBuffer + max(userFramesPerBuffer, (suggestedLatency * sampleRate))' as discussed on PA mailing-lists
 - it is now possible to achieve 5.33ms latency in Polling & Exclusive mode (WOW64 or Native)
 - Polling method for output will benefit from direct WASAPI buffer pointer exposure to a user space through a callback (no copying)
2010-07-06 07:28:48 +00:00
dmitrykos
87d4873e95 wasapi:
- made framesPerBuffer and suggestedLatency behavior as per PA specification, e.g. framesPerBuffer set main device period, suggestedLatency is a surplus if not 0
 - fixed bug with Input in situation when WASAPI operates in native not-WOW64 process and using event mechanism would provide less frames to a user callback than expected (due to the fact as WASAPI's audio client provides only 1 packet per GetBuffer call which)
2010-06-28 21:29:16 +00:00
dmitrykos
fd47a09808 wasapi: fixed very rare bug causing a dead looping if WASAPI input stream is being aborted 2010-06-22 19:53:00 +00:00
dmitrykos
5444956b5c wasapi: fixed full-duplex failure (when host sample types differ) due to incorrect check made on I/O host buffer sizes 2010-06-10 09:45:54 +00:00
dmitrykos
23aed33a71 wasapi: fixed host-WASAPI related bug when selected 24-bit Input does not produce any audio, while 16 and 32-bits do, now if 24-bits selected by user (paInt24) PA WASAPI asks 32-bits (paFloat32) from WASAPI device and PA converters provide 24-bit data which is converted from 32-bit host buffer. 2010-06-10 09:09:19 +00:00
dmitrykos
d2568e4ae7 wasapi:
- implemented support for full-duplex mode (it always uses polling(pull) WASAPI behavior, if latency <15msec needed then event interface must be done)
 - fixed mono-to-stereo converter for input stream
 - mono-to-stereo converter will also automatically operate in shared mode (if WASAPI driver does not support mono for output, or only stereo for input)
2010-06-01 17:26:37 +00:00
dmitrykos
3e700ec6d2 wasapi:
- implemented support of non-Interlieved buffers (paNonInterleaved) for WASAPI blocking interface for input and output
 - blocking methods will now use PA sample converters
2010-05-31 09:46:49 +00:00
dmitrykos
9bb962b93b wasapi:
- re-enabled Event-driven mode for Windows 7 x64 platform if application runs as WOW64 process
2010-05-18 17:23:56 +00:00
dmitrykos
876f5f777c wasapi:
- fixed Event-driven mode, broken in 1496 rev.
2010-05-18 15:02:41 +00:00
dmitrykos
a6485e63cf wasapi:
- using WOW64 workaround (fall-back to a Poll-driven mode) for any WOW64 process regardless of Windows version due to report of same bug under Windows 7 x64
2010-05-17 21:15:13 +00:00
dmitrykos
e7bf9ce49d wasapi:
- fixed object (IAudioRenderClient/IAudioCaptureClient) leak if stream is stopped and restarted without closing
 - improved IAudioClient event handle management on stream restart (not deleting/creating event handle but rather keeping it until stream is closed)
2010-05-17 18:37:00 +00:00
dmitrykos
083b34a10f wasapi:
- fixed occasional crash-bug which may be caused by a lightweight application that starts stream, checks if stream is running and if not terminates the stream: WASAPI implementation wasn't taking such behavior into account and stream termination (with structure deallocation) could happen during a thread start causing a crash on bad pointer usage
 - fixed Pa_IsStreamActive and similar not correctly reporting stopped stream if that was stopped from within a callback function (playback/capture) by returning paComplete
2010-05-12 18:08:45 +00:00
dmitrykos
50986ea63b wasapi:
- new method PaWasapi_GetFramesPerHostBuffer which allows to get number of input/output frames per host (WASAPI) buffer, this method helps to find out maximal values for PaWasapiHostProcessorCallback
 - documentation fixes
2010-04-16 08:31:19 +00:00
dmitrykos
43146e690e wasapi:
- added calling thread id checks to match Pa_Initialize/Pa_Uninitialize in the same calling thread, if not the case then console warning will be thrown and CoUninitialize will not be called (preferring leak over uninitializing user-side COM)
2010-04-15 17:44:13 +00:00
dmitrykos
8186129234 wasapi:
- fixed Windows 7/Server 2008 R2 and Future detection, this fixes minimal/maximal device periods correction
 - added CO_E_NOTINITIALIZED to text errors with action to take for user in case it happens
2010-04-15 17:15:14 +00:00
dmitrykos
14d09847a3 wasapi:
- improved device buffer alignment calculation allowing to set as precise device latency as possible
2010-04-12 21:15:50 +00:00
dmitrykos
7d037383bc wasapi:
- fixed crash in Pa_OpenStream call if WASAPI device did not open or something failed (happened on stream handle cleanup due to double attempt to free same pointer)
 - improved the way WASAPI device is opening, such error as AUDCLNT_E_BUFFER_SIZE_ERROR which comes due to incorrectly small device period is fixed for Vista (and all other, including future) systems as well, latency will be corrected to device minimum (usually 3ms).
 - if suggestedLatency is set to 0 in Pa_OpenStream call then WASAPI device will select device default latency (in Exclusive mode it is 10ms, in Shared 20ms)
 - improved on-screen logging of WASAPI devices available during WASAPI initialization phase
2010-04-12 20:55:34 +00:00
dmitrykos
94c7f9a355 wasapi:
- fixed AUDCLNT_E_INVALID_DEVICE_PERIOD under Windows 7 if latency is set to lower than minimal device period
 - fixed AUDCLNT_E_INVALID_DEVICE_PERIOD under Windows 7 if latency for Exclusive mode is higher than 500ms, for Shared mode higher than 2000ms
2010-04-11 16:04:21 +00:00
dmitrykos
d714962621 wasapi:
- fixed int24 Mono to Stereo mixer (affects Mono streams starting in Exclusive mode)
pa_converters: 
 - avoid using 64-bit integer math for Int24_To_Float32 and Int24_To_Int32 under x64 Posix platforms (long is 64-bit there), now using explicit PaInt32 type
2010-03-25 23:27:27 +00:00
dmitrykos
14a79e0e89 wasapi:
- fixed bug when Exclusive mode was wrongly opening Stereo stream if Mono stream was requested (note: WASAPI device usually does not support Mono in Exclusive mode), resulted in distorted sound
 - implemented workaround for WASAPI limitation - in Exclusive mode Mono stream is not supported: now PA creates internal audio device in Stereo mode, and after callback call Mono data is mixed into Stereo output, this workaround is not supported for Blocking mode. all this is done transparent for user, automatically.
2010-03-24 19:08:38 +00:00
dmitrykos
4ba123be9a wasapi: small corrections to improve CoInitialize/CoUninitialize sequence (taken from DS implementation) 2010-03-17 10:37:29 +00:00