summaryrefslogtreecommitdiffstats
path: root/audio
Commit message (Collapse)AuthorAgeFilesLines
* ao_pipewire: tell audio server about number of queued samplesThomas Weißschuh2022-08-091-1/+2
|
* ao_pipewire: use mpv loggingThomas Weißschuh2022-08-041-1/+1
|
* af_rubberband: add new engine option in rubberband 3.0.0Christoph Heinrich2022-08-031-2/+15
|
* ao_pipewire: prevent deprecation warning for pw_stream_get_time()Thomas Weißschuh2022-07-081-1/+7
|
* ao_pipewire: pipewire uses linear volumeWim Taymans2022-07-081-3/+2
| | | | Don't use cube root volumes, pipewire uses linear volumes.
* ao_pipewire: don't access core after disconnectWim Taymans2022-07-081-1/+0
| | | | | | | | pw_core_disconnect frees the core, so accessing it afterward to destroy the context is not allowed. Instead, just destroy the context, the first thing it does is disconnect all cores for us.
* ao_pipewire: zero listenersWim Taymans2022-07-081-0/+2
| | | | | The listeners need to be cleared because removing them might invoke the removed handler, which could otherwise point to invalid memory.
* ao_pipewire: support ao-volume on non-stereo channel layoutsAlex B2022-07-081-9/+23
| | | | | | | | mpv only remembers volume for two channels. Always apply the same volume to all channels in case of non-stereo layout similarly to ao_pulse. Don't try to do anything smart when averaging volumes, normally they are equal anyway.
* audio/chmap: add mp_iterate_builtin_layoutsJan Ekström2022-06-152-0/+32
| | | | | Mostly useful for unit tests in order to access the channel layouts from chmap which have mapped channels.
* ad_lavc: switch to AVChannelLayout when availableJan Ekström2022-06-151-1/+18
|
* af_lavcac3enc: switch to AVChannelLayout when availableJan Ekström2022-06-141-3/+36
|
* af_lavcac3enc: refactor chmap adding into its own functionJan Ekström2022-06-141-7/+13
| | | | This simplifies ifdeffery with AVChannelLayouts.
* ao_lavc: switch to AVChannelLayout when availableJan Ekström2022-06-121-0/+6
|
* audio/aframe: switch to AVChannelLayout when availableJan Ekström2022-06-121-0/+32
|
* audio: add AVChannelLayout helpers to convert from/to mp_chmapJan Ekström2022-06-122-0/+83
| | | | | | | | | This is the new FFmpeg channel layout structure, which now combines channel count and layout into a single location. Only unspecified (channel count only) and native (channel layout mask based) layouts are currently supported for the initial move towards non-deprecated APIs.
* various: remove trailing whitespaceGuido Cella2022-05-144-6/+6
|
* various: fix typosCœur2022-04-251-1/+1
|
* ao_pipewire: Do not hold thread lock during loop stopThomas Weißschuh2022-03-311-3/+1
| | | | | | | Stopping the thread is done using pw_thread_loop_stop(), *which must be called without the lock held.* Fixes #10033
* ao_pipewire: fix resource lifetimesThomas Weißschuh2022-03-301-7/+21
| | | | | | | We have to destroy the core before destroying the loop. Also we have to lock the mainloop for operations on its objects. Fixes #10003
* ao_sndio: fix parentheses warningLaserEyess2022-03-111-3/+3
| | | | | No change in logic, but wrap the LT operator and the && in parentheses to silence the compiler warning.
* ao_pipewire: fix ao-volume handlingAlex B2022-02-111-3/+6
| | | | | | | | Pass channel volumes to `pw_stream_set_control` as array. This is correct calling conventions and prevents right channel muting every time ao-volume property is changed. Terminate `pw_stream_set_control` calls with 0.
* ao_pipewire: validate pod creationThomas Weißschuh2022-02-061-0/+6
| | | | | Our allocated buffers should be big enough, but add some errorhandling just in case.
* ao_pipewire: add support for device selectionThomas Weißschuh2022-02-061-14/+188
|
* ao_sndio: bugfix and small refactoring for #8314Andrew Krasavin2022-01-221-43/+44
| | | | | | | | Changes: * fixed hangups in the loop function and in some other cases * refactoring according to @michaelforney's recommendations in #8314 * a few minor and/or cosmetic changes * ability to build ao_sndio using meson
* ao_sndio: add this audio output againrim2022-01-222-0/+321
| | | | | | | | | Changes: - rewrite to use new internal MPV API; - code refactoring; - fix buffers size calculations; - buffer set to auto; - reset() - clean/reinit device only after errors;
* ao/pipewire: Add copyright headerPhilip Langdale2022-01-171-0/+21
| | | | | | | | | | Sometimes the most obvious things can be missed. Reflects authorship described in the original commit. * https://github.com/mpv-player/mpv/pull/7902 * https://github.com/Oschowa/mpv/commit/fddb143282fa74425a8a6f29c9566e51777759d0 * https://github.com/mpv-player/mpv/pull/9587
* ao_pipewire: Add PipeWire audio backendThomas Weißschuh2022-01-172-0/+400
| | | | | | | | | | | | | | | | | | | | | | | | | | The AO provides a way for mpv to directly submit audio to the PipeWire audio server. Doing this directly instead of going through the various compatibility layers provided by PipeWire has the following advantages: * It reduces complexity of going through the compatibility layers * It allows a richer integration between mpv and PipeWire (for example for metadata) * Some users report issues with the compatibility layers that to not occur with the native AO For now the AO is ordered after all the other relevant AOs, so it will most probably not be picked up by default. This is for the following reasons: * Currently it is not possible to detect if the PipeWire daemon that mpv connects to is actually driving the system audio. (https://gitlab.freedesktop.org/pipewire/pipewire/-/issues/1835) * It gives the AO time to stabilize before it is used by everyone. Based-on-patch-by: Oschowa <oschowa@web.de> Based-on-patch-by: Andreas Kempf <aakempf@gmail.com> Helped-by: Ivan <etircopyhdot@gmail.com>
* af_lavcac3enc: fix some minor thingssfan52022-01-101-2/+3
| | | | mark an array as static, a typo and a missing free
* af_lavcac3enc: replace deprecated av_init_packet()sfan52022-01-101-11/+17
|
* af_lavcac3enc: fix memory leak on no-opNiklas Haas2021-12-141-16/+19
| | | | | | | | | Simply returning out of this function leaks avpkt, need to always "goto done". Rewrite the logic a bit to make it more clear what's going on (IMO). Fixes #9593
* ao_openal: enable AL_SOFT_direct_channels_remix extension by defaultIvan2021-11-291-3/+9
| | | | Prevent audio distortions caused by OpenAL's 3D effects.
* audio: stop corrupting audio on underreadsAman Karmani2021-11-201-1/+2
| | | | | | regression introduced in b74c09efbf7c6969fc053265f72cc0501b840ce1 Signed-off-by: Aman Karmani <aman@tmm1.net>
* ao_opensles: add guards for sample rate to useTom Yan2021-11-191-0/+2
| | | | | | Upstream "Wilhelm" (the Android OpenSLES implementation) supports only 8000 <= rate <= 192000. Make sure mpv resamples the audio when necessary.
* options: remove always true m_obj_list::allow_unknown_entriesEmil Velikov2021-11-151-1/+0
| | | | | | | Ever instance of m_obj_list is a constant and for all of them, the field is true. Just remove the field all together. Signed-off-by: Emil Velikov <emil.l.velikov@gmail.com>
* ao_oss: define PATH_DEV_MIXER as it is an internal defineJan Ekström2021-11-101-0/+1
| | | | | | | | This fixes a mismatch between configure working and build time failing with Linux + OSSv4, enabling compilation on Debian based Linux systems with the oss4-dev package. Fixes #9378
* audio: replace deprecated av_mallocz_arraysfan52021-11-051-1/+1
|
* ao_audiotrack: change buffer sizing logicAman Karmani2021-10-211-2/+2
| | | | | | | | Previously number of channels was being ignored. The buffer will now be between 75ms and 150ms Signed-off-by: Aman Karmani <aman@tmm1.net>
* ao_audiotrack: allocate chunk buffer based on negotiated sizeAman Karmani2021-10-211-2/+3
| | | | Signed-off-by: Aman Karmani <aman@tmm1.net>
* ao_audiotrack: support delay up to 2s as normalAman Karmani2021-10-211-2/+2
| | | | | | Fixes issues streaming to echo speaker pair from firetv devices. Signed-off-by: Aman Karmani <aman@tmm1.net>
* ao_audiotrack: set device_buffer based on underlying buffer size when availableAman Karmani2021-10-211-0/+10
| | | | Signed-off-by: Aman Karmani <aman@tmm1.net>
* ao_audiotrack: use new style initializer for AudioTrack when availableAman Karmani2021-10-211-11/+114
| | | | | | Fixes deprecation warnings printed when using this driver. Signed-off-by: Aman Karmani <aman@tmm1.net>
* Revert "audio: fix ao_reset() not clearing paused state leading to stuck AO"sfan52021-07-181-1/+0
| | | | | In hindsight this is obviously broken. This reverts commit fb5d976cb070020e35501685c9f84b9435b248e6.
* audio: fix ao_reset() not clearing paused state leading to stuck AOsfan52021-07-161-0/+1
| | | | | This would happen when switching from playback stuck in cache wait (underrun) to another file.
* af_scaletempo2: use gcc vectors to speed up inner loopNiklas Haas2021-05-261-3/+72
| | | | | | | | | | This brings my scaletempo2 benchmark down from ~22s to ~7s on my machine (-march=native), and down to ~11s with a generic compile. Guarded behind an appropriate #ifdef to avoid being ableist against people who have the clinical need to run obscure platforms. Closes #8848
* build: address AVCodec, AVInputFormat, AVOutputFormat const warningssfan52021-05-013-3/+3
| | | | FFmpeg recently changed these to be const on their side.
* ao/pulse: fix incorrect state reported after resetsfan52021-04-291-0/+1
| | | | fixes #8768
* audio/aframe: reuse data buffer if less than 8 channelssfan52021-04-081-6/+12
| | | | | | | | This fixes audio encoding crashing under ASan. When extended_data != data, FFmpeg copies more pointers from extended_data (= the number of channels) than there really are for non-planar formats (= exactly 1), but that's not our fault. Regardless, this commit makes it work in all common cases.
* ao_oss: add this audio output againrim2021-03-152-0/+414
| | | | | | | | | | | Changes: - code refactored; - mixer options removed; - new mpv sound API used; - add sound devices detect (mpv --audio-device=help will show all available devices); - only OSSv4 supported now; Tested on FreeBSD 12.2 amd64.
* ao/pulse: signal the mainloop when ops are doneThomas Weißschuh2021-03-111-2/+5
| | | | | | | | Without the explicit signal the call to pa_threaded_mainloop_wait() will not return as soon as possible. Fixes 4f07607888541e6eb40fc5c3a1edfeb84aacb0f7 See #8633
* ao/pulse: wait for command completion when setting volume or muteThomas Weißschuh2021-03-091-13/+8
| | | | | | | | | | | | | | | | This makes the behavior of all control messages consistent, fixing an inconsistency that has been with us since 4d8266c739915184d3787d7ab727ac03378b341b - which is the initial rework of the polyaudio AO into the pulseaudio AO. Muting the stream also directly triggers an update to the OSD. When not waiting for the command completion this read of the mute property may read the old state. A stale read. Note that this somehow was not triggered on native Pulseaudio, but it is an issue on Pipewire. See https://gitlab.freedesktop.org/pipewire/pipewire/-/issues/868
* af_scaletempo2: fix crash for speed >= 16Dorian Rudolph2021-02-151-9/+13
| | | | | | | The input buffer size was fixed, but the required size depends on the speed. Now the buffer will be resized dynamically. Fixes #8081
* ao_alsa: handle -EPIPE XRUNs from snd_pcm_statusJan Ekström2020-11-091-2/+11
| | | | | | | | | Set pcm state to SND_PCM_STATE_XRUN in case -EPIPE is received, and handle this state as per the usual logic. This way snd_pcm_prepare gets called, and the loop continued. Inspired by a patch posted by malc_ on #mpv.
* ao_alsa: always initialize state if passedJan Ekström2020-11-091-9/+7
| | | | | Based on ao_play_data's assert, we are always expected to give non-default values back from an AO's get_state.
* audio: take paused state into account in ao_start()sfan52020-09-201-1/+1
| | | | | It makes no sense to instruct the AO to start the pull callbacks when we know there's nothing to play (only affects pull AOs).
* audio: move start() calls outside of locksfan52020-09-201-3/+10
| | | | | Pull based AOs might want to call ao_read_data() inside start(). This fixes ao_opensles deadlocking.
* ao_alsa: make partial writes an error messagewm42020-09-031-2/+2
| | | | And I think "partial write" is easier to understand than "short write".
* audio: fix stream-silence with push AOs (somewhat)wm42020-09-031-5/+10
| | | | | | | | | | | | | | | | | | | | | | | | --audio-stream-silence is a shitty feature compensating for awful consumer garbage, that mutes PCM at first to check whether it's compressed audio, using formats advocated and owned by malicious patent troll companies (who spend more money on their lawyers than paying any technicians), wrapped in a wasteful way to make it constant bitrate using a standard whose text is not freely available, and only rude users want it. This feature has been carelessly broken, because it's complicated and stupid. What would Jesus do? If not getting an aneurysm, or pushing over tables with expensive A/V receivers on top of them, he'd probably fix the feature. So let's take inspiration from Jesus Christ himself, and do something as dumb as wasting some of our limited lifetime on this incredibly stupid fucking shit. This is tricky, because state changes like end-of-audio are supposed to be driven by the AO driver, while playing silence precludes this. But it seems code paths for "untimed" AOs can be reused. But there are still problems. For example, underruns will just happen normally (and stop audio streaming), because we don't have a separate heuristic to check whether the buffer is "low enough" (as a consequence of a network stall, but before the audio output itself underruns).
* ao_lavc: slightly simplify filter usewm42020-09-031-12/+12
| | | | | | Create a central function which pumps data through the filter. This also might fix bogus use of the filter API on flushing. (The filter is just used for convenience, but I guess the overall result is still simpler.)
* ao_alsa: log more information on short writeswm42020-09-021-2/+4
|
* audio: fix AVFrame allocation (crash with opus encoding)wm42020-09-011-0/+2
| | | | | | | | | | | | AVFrame doesn't have public code for pool allocation, so mpv does it manually. AVFrame allocation is very tricky, so we added a bug. This crashed with libopus encoding, but not some other audio codecs, because the libopus libavcodec wrapper accesses AVFrame.data. Most code tries to avoid accessing AVFrame.data and uses AVFrame.extended_data, because using the former would subtly corrupt memory on more than 8 channels. The fact that this problem manifested only now shows that most AVFrame consuming FFmpeg code indeed uses extended_data for audio.
* ao_openal: restore working condition with new push APILAGonauta2020-08-311-8/+10
|
* ao: remove unused fieldwm42020-08-311-1/+0
|
* audio: fix inefficient behavior with ao_alsa, remove period_size fieldwm42020-08-297-24/+13
| | | | | | | | | | | | | | | | | | | | It is now the AO's responsibility to handle period size alignment. The ao->period_size alignment field is unused as of the recent audio refactor commit. Remove it. It turns out that ao_alsa shows extremely inefficient behavior as a consequence of the removal of period size aligned writes in the mentioned refactor commit. This is because it could get into a state where it repeatedly wrote single samples (as small as 1 sample), and starved the rest of the player as a consequence. Too bad. Explicitly align the size in ao_alsa. Other AOs, which need this, should do the same. One reason why it broke so badly with ao_alsa was that it retried the write() even if all reported space could be written. So stop doing that too. Retry the write only if we somehow wrote less. I'm not sure about ao_pulse.
* audio_buffer: remove thiswm42020-08-292-199/+0
| | | | | | Unused, was terrible garbage. It was (or at least its implementation was) always a make-shift solution, and just gross bullshit. It is unused now, so delete it.
* audio: refactor how data is passed to AOwm42020-08-294-371/+304
| | | | | | | | | | | | | | | | | | | | | | | | | | | | This replaces the two buffers (ao_chain.ao_buffer in the core, and buffer_state.buffers in the AO) with a single queue. Instead of having a byte based buffer, the queue is simply a list of audio frames, as output by the decoder. This should make dataflow simpler and reduce copying. It also attempts to simplify fill_audio_out_buffers(), the function I always hated most, because it's full of subtle and buggy logic. Unfortunately, I got assaulted by corner cases, dumb features (attempt at seamless looping, really?), and other crap, so it got pretty complicated again. fill_audio_out_buffers() is still full of subtle and buggy logic. Maybe it got worse. On the other hand, maybe there really is some progress. Who knows. Originally, the data flow parts was meant to be in f_output_chain, but due to tricky interactions with the playloop code, it's now in the dummy filter in audio.c. At least this improves the way the audio PTS is passed to the encoder in encoding mode. Now it attempts to pass frames directly, along with the pts, which should minimize timestamp problems. But to be honest, encoder mode is one big kludge that shouldn't exist in this way. This commit should be considered pre-alpha code. There are lots of bugs still hiding.
* audio: clarify set_pause() documentationwm42020-08-271-0/+1
|
* audio: adjust frame clipping for spdif formatswm42020-08-271-2/+4
| | | | | | Allow mp_aframe_clip_timestamps() to discard a spdif frame if it's entirely out of the timestamp range. Just a minor thing that might make handling these dumb formats easier.
* audio: remove unused ring.h includeswm42020-08-272-2/+0
| | | | | From what I can tell, this has been copy-pasted from times when ao_coreaudio still used its own ringbuffer, instead of the common code.
* ao/pulse: create the stream corkedsfan52020-08-261-1/+1
| | | | | | | | | Previously get_state() would keep setting the cork status while paused, but it only does for that after underflows now. Correct this oversight by creating the stream corked for start() to uncork it at a later time. fixes #8026
* ao/lavc: add channels and channel_layout to AVFrameekisu2020-08-071-0/+2
| | | | | | FFmpeg expects those fields to be set on the AVFrame when encoding audio, not doing so will cause the avcodec_send_frame call to return EINVAL (at least in recent bu