Timo Wischer [Fri, 23 Feb 2018 14:18:08 +0000 (15:18 +0100)]
jack: Use boundary as hw_ptr wrap around
instead of using buffer_size as wrap around.
This is required to detect Xruns.
It is also required to allow the JACK thread
to processes the whole ALSA audio buffer at once
without calling snd_pcm_avail_update() in between.
For example when the hw_ptr will be updated with
hw_ptr += buffer_size
and it is using the buffer_size as wrap around
hw_ptr %= buffer_size
would result in the same value as before the add operation.
Due to that the user application would not recognize
that the complete audio buffer was copied.
Signed-off-by: Timo Wischer <twischer@de.adit-jv.com> Signed-off-by: Takashi Iwai <tiwai@suse.de>
Kui Wang [Thu, 13 Jul 2017 19:33:05 +0000 (19:33 +0000)]
pulse: prevent double-free when pulse_hw_constraint returns error
When pulse_hw_constraint returns error, snd_pcm_ioplug_delete() is called.
It will then call pulse_close() where "snd_pcm_pulse_t *pcm" will be free.
Then if goto the "error" label, the "snd_pcm_pulse_t *pcm" will be double-free.
To prevent this, just jump over the code which might cause double-free.
Signed-off-by: Kui Wang <wangkuisuper@hotmail.com> Signed-off-by: Takashi Iwai <tiwai@suse.de>
Daniel Kirchner [Wed, 9 Mar 2016 08:17:09 +0000 (09:17 +0100)]
a52: Fix usage of obsoleted avcodec_*_frame() functions
pcm_a52.c uses avcodec_alloc_frame and avcodec_free_frame that have
been replaced by av_frame_alloc and av_frame_free in recent versions
of libavcodec. The following patch should fix this while remaining
backwards compatible.
Tanu Kaskinen [Wed, 27 Jan 2016 11:45:51 +0000 (13:45 +0200)]
pph: include config.h from rate_speexrate.c
Fixes compilation against libspeexdsp 1.2rc3.
rate_speexrate.c includes speex_resampler.h, which depends on config.h
by referencing the HAVE_SPEEX_SPEEXDSP_TYPES_H macro. AFAIK it's not
a good idea to include config.h from headers (I don't know/remember
why, though), which is why I include config.h from rate_speexrate.c
instead of speex_resampler.h.
Tom Yan [Tue, 12 Jan 2016 07:57:39 +0000 (15:57 +0800)]
a52: fix reported input channel order
a52 plugin expects the input to be in ALSA order and remaps it to general order when encoding. However it reports that the input it takes should be in general order.
This fix should make programs (e.g. mpv) that is aware of channel layout reported by ALSA remap sources appropriately before sending when necessary.
It should not cause any regression to programs (e.g. mplayer) that does not check the reported channel layout (hence not affected by the issue) and remaps sources anyway.
Signed-off-by: Tom Yan <tom.ty89@gmail.com> Signed-off-by: Takashi Iwai <tiwai@suse.de>
Valentin Corfu [Tue, 11 Aug 2015 06:37:14 +0000 (09:37 +0300)]
jack: Fixing a small memory leak
A small memory leak can be observed when using alsa-plugins (jack).
Check the following valgrind log:
...
==1034== 8 bytes in 1 blocks are definitely lost in loss record 7 of 108
==1034== at 0x4027E5A: calloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==1034== by 0x4035102: snd_pcm_jack_prepare (in /usr/lib/alsa-lib/libasound_module_pcm_jack.so)
==1034== by 0x40D07AB: snd_pcm_ioplug_prepare (pcm_ioplug.c:145)
==1034== by 0x4084961: snd_pcm_prepare (pcm.c:1052)
==1034== by 0x409DDB4: snd_pcm_plugin_prepare (pcm_plugin.c:162)
==1034== by 0x4084961: snd_pcm_prepare (pcm.c:1052)
==1034== by 0x409DDB4: snd_pcm_plugin_prepare (pcm_plugin.c:162)
==1034== by 0x4084961: snd_pcm_prepare (pcm.c:1052)
==1034== by 0x4084A1D: snd_pcm_hw_params (pcm.c:838)
==1034== by 0x4090013: snd_pcm_set_params (pcm.c:8053)
==1034== by 0x80486EB: main (in /root/pcm_min_ok)
...
==1034== LEAK SUMMARY:
==1034== definitely lost: 8 bytes in 1 blocks
==1034== indirectly lost: 0 bytes in 0 blocks
==1034== possibly lost: 31,311 bytes in 1,630 blocks
==1034== still reachable: 5,619 bytes in 24 blocks
==1034== suppressed: 0 bytes in 0 blocks
...
The previous commit fixed the build of the recent speexdsp, but it
also broke the build with the old library. Actually the only needed
change is the inclusion of speex/speex_types.h instead of
speex/speexdsp_types.h, so it can be easily worked around via the
check in configure script.
Along with this change, make the version check back to 1.2 from
1.2rc2, as 1.2rc1 works fine now again, too.
Speexdsp was separated from speex in 1.2rc2. speex_types.h is not
shipped by speexdsp, so alsa-plugins shouldn't use that file. speexdsp
has speexdsp_types.h, which has the same contents as speex_types.h.
speexdsp_types.h is a new file introduced in 1.2rc2, so this change
bumps the minimum supported speexdsp version. The version check in
configure.ac will actually break if speexdsp 1.2 ever gets released,
because pkg-config thinks that "1.2" < "1.2rc2", but I think it's
useful to fail if the installed speexdsp version is 1.2rc1 (which I
believe is very common on current distributions). If a non-rc version
of speexdsp will ever get released, I hope version number 1.2 will be
skipped for this reason. (A non-rc version seems unlikely, since
1.2rc1 was released years ago, so it's pretty likely that the project
is stuck on so called "release candidates" forever...)
Takashi Iwai [Thu, 12 Mar 2015 08:13:44 +0000 (09:13 +0100)]
rate: Allow LGPL for libsamplerate commercial licensee
alsa-plugins-rate is tagged with GPL just for following the license of
libsamplerate. However, libsamplerate provides a commercial license
to allow it used with less restrictions. In that case, we also don't
have to stick with GPL. Instead, the code follows LGPL like other
plugin codes in this package.
a52: Ignore start request if we're already running
When trying to start a PCM that's already running, the result is EBADFD.
We might have implicitly started the buffer by filling it up,
so just ignore this request if we're already running.
Reported-by: Chow Loong Jin <hyperair@ubuntu.com> Signed-off-by: David Henningsson <david.henningsson@canonical.com> Signed-off-by: Takashi Iwai <tiwai@suse.de>
jack: Restore PID to jack client name when not specified explicitly
Commit 14190cd8 added a facility to explicitly name Jack clients with
a 'name' option, but did so in a way that was not fully
backwards-compatible with older versions of the alsa-plugins. There
were two issues:
1. Re-using the magical "name" variable, which comes preloaded with
the name of the PCM
2. The code assumed snd_config_get_string sets a variable to NULL if
the config entry does not exist. Instead, this function leaves the
variable unchanged.
The result of these two errors meant that the PCM name would be
treated as if it were a user-defined name, and the old code which
embedded the PID would never be run
This code uses a completely new variable to store the explicitly-set
client name, so that the two code paths no longer collide.
Sergey [Mon, 26 May 2014 03:54:05 +0000 (07:54 +0400)]
jack: fix polling and recovering
This patch fixes polling in alsa-to-jack plugin.
It makes poll()+_poll_revents() return correct values
when there's something to read/write.
It also makes jack pcm survive snd_pcm_recover(-EPIPE).
Valentin Corfu [Tue, 11 Feb 2014 09:06:36 +0000 (04:06 -0500)]
jack: Allow to specify a client name as parameters
The current jack client name contains the process id of the application
providing the audio samples. This leads to unpredictable jack client
names which makes handling of the connections by a controlling
application very hard.
This modification now, allows to specify a client name as parameters
in the configuration file. The implementation is backward
compatible and simply adds a new configuration option to the plugin.
Takashi Iwai [Fri, 30 Nov 2012 16:15:44 +0000 (17:15 +0100)]
a52: Add the support of recent libavcodec / libavutil
The recent avcodec requires the planar support, which is essentially
non-interleaved formats. We need to limit the accepted access types
depending on it.
pcm_pulse: set prebuf parameter according to software parameters
The current default value for prebuf is very high, almost the full
virtual ALSA buffer. This breaks some application especially where
low latency is involved.
This patch makes pcm_pulse implement the sw_params callback and get
the prebuf value from the ALSA software parameters. Thus the
trigger latency is much more like what an ALSA application should
expect from an ALSA PCM device.
Acked-by: David Henningsson <david.henningsson@canonical.com> Signed-off-by: Takashi Iwai <tiwai@suse.de>
Andrew Eikum [Mon, 20 Aug 2012 09:28:14 +0000 (11:28 +0200)]
pulse: Support 24-bit formats
These formats were introduced in PulseAudio 0.9.15. There aren't any
new formats supported since then, so this also brings the PulseAudio
plugin in sync with current PulseAudio.
Signed-off-by: Andrew Eikum <aeikum@codeweavers.com> Signed-off-by: Takashi Iwai <tiwai@suse.de>
Fons Adriaensen [Mon, 9 Jan 2012 17:18:10 +0000 (18:18 +0100)]
jack: Fix revents for playback
The following patch will make snd_pcm_poll_descriptors_revents()
return the correct value when used on a jack plugin device.
The current version returns POLLIN regardless of capture or
playback.
Takashi Iwai [Tue, 23 Aug 2011 15:02:17 +0000 (17:02 +0200)]
pulse - only underrun if no more data has been written
Original patch from David Henningsson <david.henningsson@canonical.com>
If more data has already been written after the underrun, the underrun
will automatically end and therefore we should not report it or
restart the stream.
[ This patch adds a more check of underrun with a new PA function so
that the underrun handles works more reliably. As the feature is
supported only in a recent version of PA, the underrun handling is
enabled as default now for the new PA, while it's still disabled for
older PA. -- tiwai ]
Signed-off-by: David Henningsson <david.henningsson@canonical.com> Signed-off-by: Takashi Iwai <tiwai@suse.de>
applications hang after some seconds when using the jack plugin.
Kevin Ross <kevin@familyross.net> writes:
The cause: The plugin creates a pipe, so that the fd's could be
polled to indicate completion of a transfer. However, the call to
write() blocks when playing audio, as nothing actually reads from the
pipe, and it fills up until it blocks.
Making the socket non-blocking fixes the problem, and testing with
playback and capture both work properly for me now.
[Adrian: I've also tested Kevin's patch and confirm it works.]
Signed-off-by: Adrian Knoth <adi@drcomp.erfurt.thur.de> Signed-off-by: Takashi Iwai <tiwai@suse.de>
a52 - Fix a52 codec with recent libavcodec updates
The recent libavcodec is changed to accept only float input, but
the old ac3 encoder is still somehow working with a different name.
This patch makes it working again.
Added a config option "handle_underrun" to specify whether pulse plugin
handles the underrun reported from PA. The default value is now set to
false, i.e. it will ignore underruns in PA (for good reasons below).
You can take back to the old behavior by setting handle_underrun true.
The original idea was brought by David Henningsson <diwic@ubuntu.com>,
while this patch is simplified and makes the behavior configurable.
The reasons for avoiding underruns (cited from David's original patch):
Reporting underruns to ALSA seems to do more bad than good, for these reasons:
* If pulseaudio gets an underrun, the normal way to end that underrun is to
feed it with more buffers. This is different from the ALSA way of dealing
with underruns, which requires hardware buffer pointers to be reset.
* In addition, underrun signals are delivered asynchronously from pulseaudio.
This means that there might be more buffers on the way to pulseaudio when
the underrun is reported, making the underrun obsolete. Unfortunately,
there is currently no known way to determine whether this is the case or
not.
This patch improves recovering from underruns, and prevents hangs inside
snd_pcm_write* and snd_pcm_read* due to snd_pcm_avail* returning too
low values. It especially helps low latency situations.
Signed-off-by: David Henningsson <diwic@ubuntu.com> Signed-off-by: Takashi Iwai <tiwai@suse.de>
Anssi Hannula [Fri, 27 Nov 2009 15:15:45 +0000 (17:15 +0200)]
a52 - fix 5.1 channel order with recent libavcodec
As of SVN r18540 libavcodec expects 5.1 channel audio with SMPTE channel
order. Fix ALSA a52 plugin to use that order when built against such a
libavcodec. Minor version of libavcodec was raised on the same day (Apr
17th 2009), so use that for the check.
Unify (and simplify) the paths that check for the validity of a
stream/context: always call into check_stream()/pulse_check_connection()
when applicable instead of rolling our own checks each time. Also check
for validity of mainloop before locking it.
snd_pulse_t::state was mostly shadowing the state of
pa_context_get_state(snd_pulse_t::context), so get rid of it and use the
state of the context directly.
pulse: move a couple of PCM related functions from pulse.c to pcm_pulse.c
A number of functions in pulse.c are only relevant for the PCM handling,
so let's move them to pcm_pulse.c. This allows us to simplify their
argument lists a bit.
pulse: call pa_threaded_mainloop_wait() to handle spurious wakeups
pa_threaded_mainloop_wait() can wake up for no reason, according to the
specs of the underlying POSIX ptrhead_cond_wait() docs, so we need to
call it in a loop here which should be cleaner anyway.
Instead of hitting an assert when any of the plugin functions is called
in an invalid context we should return a clean error to make sure
programs are not unnecessarily aborted.
This should fix issues such as http://pulseaudio.org/ticket/595