aboutsummaryrefslogtreecommitdiffhomepage
path: root/audio
Commit message (Collapse)AuthorAge
...
* ao/wasapi: periodicity in shared mode must be zeroGravatar Kevin Mitchell2014-11-18
| | | | | | IAudioClient::Initialize hnsPeriodicity argument is nonzero only for exclusive mode http://msdn.microsoft.com/en-us/library/windows/desktop/dd370805%28v=vs.85%29.aspx
* ao/wasapi: increase buffer size to 50 msGravatar Kevin Mitchell2014-11-18
| | | | | Before it was the default device period, which was too small causing glitches on on entering/exiting fullscreen.
* audio/out: always log retrieved audio device sizeGravatar wm42014-11-18
|
* ao/wasapi: fix leaked marshaled interface streamsGravatar Jonathan Yong2014-11-18
| | | | Signed-off-by: Kevin Mitchell <kevmitch@gmail.com>
* ao/wasapi: Don't free stuff the thread may still be using on timeoutGravatar Kevin Mitchell2014-11-17
| | | | | In the unlikely event of a timeout waiting for the audio thread to return, don't free stuff that it may still be using.
* ao/wasapi: also free the threadLoop handle on uninitGravatar Kevin Mitchell2014-11-17
| | | | http://msdn.microsoft.com/en-us/library/windows/desktop/ms682453%28v=vs.85%29.aspx
* ao/wasapi: fix leaked event handlesGravatar Kevin Mitchell2014-11-17
|
* ao/wasapi: fix race condition in uninit on failure.Gravatar Kevin Mitchell2014-11-17
| | | | | | | | | When the audio thread fails to properly init, it signals failure to the main thread, AND THEN starts to clean up. For this to work, ao_init callback must not return until the thread's cleanup is finished. This is correctly handled in the ao_uninit callback by waiting for the thread to exit, so just call that to clean up the main thread. I have no idea why I didn't do this in the first place.
* ao/wasapi: silence format string warningsGravatar James Ross-Gowan2014-11-18
|
* ao_alsa: check for EAGAIN tooGravatar wm42014-11-17
| | | | | | | Simply retry on EAGAIN. I've seen this in several other projects; it might be just cargo-culting though.
* audio/out: switch back to wasapi as default on win32Gravatar wm42014-11-17
| | | | | | dsound was set as default, because there were some hard to fix problems with wasapi. These problems were probably fixed now, so let's try with wasapi as default again.
* ao/wasapi: request ao reload on thread_feed failuresGravatar Kevin Mitchell2014-11-17
| | | | | | Even with change notifications, there are still (rare) cases when the feed thread gets AUDCLIENT_DEVICE_INVALIDATED. So handle failures in thread_feed by requesting ao_reload.
* ao/wasapi: add retry loop on AUDCLNT_E_DEVICE_IN_USEGravatar Kevin Mitchell2014-11-17
| | | | this works around reinitializing too fast on device property changes
* ao/wasapi: request reset on appropriate eventsGravatar Kevin Mitchell2014-11-17
| | | | | | | | on changes to PKEY_AudioEngine_DeviceFormat, device status, and default device. call ao_reload directly in the change_notify "methods". this requires keeping a device enumerator around for the duration of execution, rather than just for initially querying devices
* ao/wasapi: add convenience functions for change notifiyGravatar Kevin Mitchell2014-11-17
|
* ao/wasapi: new wasapi device monitoring interfaceGravatar Jonathan Yong2014-11-17
| | | | | | | | | | | Implement skeleton IMMNotificationClient to watch for changes in the sound device. This will make recovery possible from changes shared mode sample rate, bit depth, "enhancements"/effects and even graceful device removal. http://msdn.microsoft.com/en-us/library/windows/desktop/dd371417%28v=vs.85%29.aspx Signed-off-by: Kevin Mitchell <kevmitch@gmail.com>
* ao/wasapi: look for "multimedia" default device instead of "console"Gravatar Kevin Mitchell2014-11-17
| | | | | | console is more for system notifications / voice command, mpv is most certainly multimedia http://msdn.microsoft.com/en-us/library/windows/desktop/dd370842%28v=vs.85%29.aspx
* ao/wasapi: put loading of default device in it's own functionGravatar Kevin Mitchell2014-11-17
|
* ao/wasapi: fix possible null dereference of pDeviceGravatar Kevin Mitchell2014-11-17
| | | | | | IMMDeviceEnumerator::GetDefaultAudioEndpoint may set pDevice to null on failure. http://msdn.microsoft.com/en-us/library/windows/desktop/dd371401%28v=vs.85%29.aspx
* ao/wasapi: tidy up better on failureGravatar Kevin Mitchell2014-11-17
| | | | | | | Before, failures, particularly in the thread loop init, could lead to a bad state for the duration of mpvs execution. Make sure that everything that was initialized gets properly and safely uninitialized.
* ao/wasapi: improve error messages and add more debug statementsGravatar Kevin Mitchell2014-11-17
| | | | | | also enforce more consistency in the exit codes and error handling thanks to Jonathan Yong <10walls@gmail.com>
* ao/wasapi: make calling of thread_init consistent with thread_uninitGravatar Kevin Mitchell2014-11-17
|
* ao/wasapi: reenable the reset functionGravatar Kevin Mitchell2014-11-17
| | | | | | the race condition that necessitated disabling this was fixed in e4403523131a69a92a8418bb3714090a408680c7
* ao/wasapi: fix leaked deviceIDGravatar Jonathan Yong2014-11-17
|
* af: remove redundant functionGravatar wm42014-11-12
|
* af: check audio params for validityGravatar wm42014-11-12
| | | | Normally, these should be valid anyway, so this is just being cautious.
* ao_lavc, vo_lavc: Fix crashes in case of multiple init attempts.Gravatar Rudolf Polzer2014-11-12
| | | | | | | | | | | | When initialization failed, vo_lavc may cause an irrecoverable state in the ffmpeg-related structs. Therefore, we reject additional initialization attempts at least until we know a better way to clean up the mess. ao_lavc currently cannot be initialized more than once, yet it's good to do consistent changes there as well. Also, clean up uninit-after-failure handling to be less spammy.
* audio: make sure AVFrame is actually refcountedGravatar wm42014-11-11
| | | | | | | | | | | The mp_audio_from_avframe() function requires the AVFrame to be refcounted, and merely increases its refcount while referencing the same data. For non-refcounted frames, it simply did nothing and potentially would make the caller pass around a frame with dangling pointers. (libavcodec should always return refcounted frames, but it's not clear what other code does; and also the function should simply work, instead of having weird requirements on its arguments.)
* audio: refuse to allocate frames in invalid formatGravatar wm42014-11-11
|
* audio: make decoders output refcounted framesGravatar wm42014-11-10
| | | | | | | | | | | | | | This rewrites the audio decode loop to some degree. Audio filters don't do refcounted frames yet, so af.c contains a hacky "emulation". Remove some of the weird heuristic-heavy code in dec_audio.c. Instead of estimating how much audio we need to filter, we always filter full frames. Maybe this should be adjusted later: in case filtering increases the volume of the audio data, we should try not to buffer too much filter output by reducing the input that is fed at once. For ad_spdif.c and ad_mpg123.c, we don't avoid extra copying yet - it doesn't seem worth the trouble.
* audio: add mp_audio_make_writeable()Gravatar wm42014-11-10
|
* audio: clear buffer array too with mp_audio_set_null_data()Gravatar wm42014-11-10
|
* audio: change how filters are inserted on playback speed changesGravatar wm42014-11-10
| | | | | | | | | | Use a pseudo-filter when changing speed with resampling, instead of somehow changing a samplerate somewhere. This uses the same underlying mechanism, but is a bit more structured and cleaner. It also makes some of the following changes easier. Since we now always use filters to change audio speed, move most of the work set_playback_speed() does to recreate_audio_filters().
* af_format: remove redundant message prefixesGravatar wm42014-11-10
|
* audio: add function to convert AVFrame to mp_audio referencesGravatar wm42014-11-10
| | | | | This is somewhat duplicated from ad_lavc.c and af_lavfi.c, but will eventually be used by both.
* audio: add mp_audio_poolGravatar wm42014-11-10
| | | | | | A helper to allocate refcounted audio frames from a pool. This will replace the static buffer many audio filters use (af->data), because such static buffers are incompatible with refcounting.
* audio: use AVBufferRef to allocate audio framesGravatar wm42014-11-10
| | | | | | | A first step towards refcounted audio frames. Amazingly, the API just does what we want, and the code becomes simpler. We will need to NIH allocation from a pool, though.
* audio/out/pull: avoid deadlock if audio callback stopsGravatar wm42014-11-09
| | | | | | | | | | | | | | | | | | | | | | | | If the audio callback suddenly stops, and the AO provides no "reset" callback, then reset() could deadlock by waiting on the audio callback forever. The waiting was needed to enter a consistent state, where the audio callback guarantees it won't access the ringbuffer. This in turn is needed because mp_ring_reset() is not concurrency-safe. This active waiting is unavoidable. But the way it was implemented, the audio callback had to call ao_read_data() at least once when reset() is called. Fix this by making ao_read_data() set a flag upon entering and leaving, which basically turns p->state into some sort of spinlock. The audio callback actually never needs to spin, because there are only 2 states: playing audio, or playing silence. This might be a bit surprising, because usually atomic_compare_exchange_strong() requires a retry-loop idiom for correct operation. This commit is needed because ao_wasapi can (or will in the future) randomly stop the audio callback in certain corner cases. Then the player would hang forever in reset().
* audio/out: consistently use double return type for get_delayGravatar wm42014-11-09
| | | | | ao_get_delay() returns double, but the get_delay callback still returned float.
* audio/out: make ao_request_reload() idempotentGravatar wm42014-11-09
| | | | | | | | | | This is what you would expect. Before this commit, each ao_request_reload() call would just queue a reload command, and then recreate the AO for the number of times the function was called. Instead of sending a command, introduce some sort of event retrieval mechanism. At least for the reload case, use atomics, because we're too lazy to setup an extra mutex.
* audio: add --audio-client-name optionGravatar wm42014-11-07
| | | | | | The main need I see for this is with libmpv - it would be confusing if some application showed up as "mpv" on whateverthehell PulseAudio uses it for (generally it does show up on various PA GUI tools).
* ao_oss: wait for events with poll()Gravatar wm42014-11-06
| | | | | | | | | | The intention is to avoid using the timeout-based fallback. There's some minor hope that this will help with OpenBSD (see #1239), although it probably won't. Some chance that this will cause trouble with obscure OSS implementations or emulations.
* audio/out/push: when using audio wait fallback, recheck conditionGravatar wm42014-11-06
| | | | | | | | | | | If calling ao->driver->wait() fails, we need to fallback to timeout- based waiting. But it could be that at this point, the mutex was already released (and then re-acquired). So we need to recheck the condition in order to avoid missed wakeups. This probably wasn't an actually occurring problem, but still could cause a small race-condition window if the dynamic fallback is actually used.
* ad_lavc: allow skip samples amount to be larger than 1 packetGravatar wm42014-11-03
| | | | | Apparently we actually need this. At least the following commit would break without this.
* ao_alsa: don't make snd_pcm_hw_params_set_buffer_time_near() error fatalGravatar wm42014-10-31
| | | | | | | | | | | | | Apparently this can "sometimes" return an error. In my opinion, this should never return an error: neither the semantics of the function, nor the ALSA documentation or ALSA sample code seem to indicate that a failure is to be expected. I'm not perfectly sure about this though (I blame ALSA being a weird, big, underdocumented API). Since it causes problems for some users, and since there is really no reason why we should abort on such an error, turn it into a warning. Fixes #1231.
* options: accept --audio-channels=autoGravatar wm42014-10-30
| | | | This sounds much more intuitive, while "empty" was a bit of a WTF.
* coreaudio: only list output devicesGravatar Stefano Pigozzi2014-10-28
|
* audio: add command/function to reload audio outputGravatar wm42014-10-27
| | | | | Anticipated use: simple solution for dealing with audio APIs which request configuration changes via events.
* ao_alsa: move parameter append code to a functionGravatar wm42014-10-23
| | | | | Why not. (I thought I needed this, but my other experiments failed. So this is merely a minor cleanup.)
* rename ao_coreaudio_device.c -> ao_coreaudio_exclusive.cGravatar Stefano Pigozzi2014-10-23
| | | | This is so that the source file name matches the AO name