Commit Graph

53 Commits

Author SHA1 Message Date
Max Kellermann
54033c74e4 output/alsa: fill period buffer with silence before draining
ALSA passes full period buffers to the hardware.  If an application
doesn't finish writing a period, libasound will nonetheless send the
partial buffer (with undefined trailing data).  This causes noise at
the end of playback.  This patch attempts to track the current
position within the period buffer, and generates silence at the end,
before calling snd_pcm_drain().
2009-11-09 22:22:31 +01:00
Jeffrey Middleton
4dc25d3908 alsa_plugin.c: workaround snd_pcm_drain bug
Reintroduce a fix from commit 52a0653 (Warren Dukes): "don't call
snd_pcm_drain unless we're already in the RUNNING state". This prevents
ALSA with dmix from sometimes hanging when snd_pcm_drain is called, e.g.
when moving from one song to the next (as in mantis issue 2634).
2009-11-02 23:58:15 -06:00
Max Kellermann
1403172ef3 output_plugin: added method "drain"
drain() is the opposite of cancel(): it waits until all data in the
buffer has finished playing.  Instead of implicitly draining in the
close() method like the ALSA plugin has been doing it forever, let the
output thread decide whether to drain or to cancel.
2009-10-29 15:59:40 +01:00
Max Kellermann
f74ee1a352 output/alsa: don't recover on CANCEL
The recovery is for nothing if we get CLOSE afterwards.  Let's not
recover in the cancel() method, and let the next play() call sort it
out.
2009-10-29 15:59:35 +01:00
Max Kellermann
097e200a97 mixer/{oss,alsa}: renamed the mixer source files 2009-10-20 21:23:05 +02:00
David Woodhouse
49ede85827 Support wrong-endian ALSA output 2009-07-19 17:15:35 +01:00
Max Kellermann
85658965c9 alsa_output: don't use atexit() to clean up the ALSA library
Call snd_config_update_free_global() manually in our finish() method,
don't use atexit().
2009-04-21 22:47:12 +02:00
Max Kellermann
66a2c5669e output_plugin: replaced output_plugin.get_mixer() with mixer_plugin
The mixer core library is now responsible for creating and managing
the mixer object.  This removes duplicated code from the output
plugins.
2009-03-26 18:23:23 +01:00
Max Kellermann
b488355df8 mixer_api: moved mixer_plugin imports to mixer_list.h
This patch allows the output plugins to import only mixer_list.h,
instead of the full mixer_api.h (which would expose internal
structures).
2009-03-14 11:36:59 +01:00
Max Kellermann
a5017a2d7c mixer_api: moved functions to mixer_control.c
mixer_control.h should provide the functions needed to manipulate a
mixer, without exposing the internal mixer API (which is provided by
mixer_api.h).
2009-03-14 11:36:50 +01:00
Avuton Olrich
0aee49bdf8 all: Update copyright header.
This updates the copyright header to all be the same, which is
pretty much an update of where to mail request for a copy of the GPL
and the years of the MPD project. This also puts all committers under
'The Music Player Project' umbrella. These entries should go
individually in the AUTHORS file, for consistancy.
2009-03-13 11:51:55 -07:00
Max Kellermann
cff29f5e86 alsa: use snd_pcm_sframes_t instead of int
snd_pcm_writei() returns the type snd_pcm_sframes_t, not int.  Use the
correct variable type.
2009-03-10 21:31:13 +01:00
Max Kellermann
855054fee1 alsa: don't close PCM handle in alsa_recover()
If the PCM handle gets disconnected, don't close and clear it in
alsa_recover().  The MPD core will call alsa_close() anyway.  This
way, we can always assume that alsa_data.pcm is always valid.
2009-03-10 21:25:45 +01:00
Max Kellermann
ab656a52da alsa: determine buffer_time if not already known
This patch fixes a theoretical (but practically impossible) flaw: the
variable "buffer_time" may be uninitialized when it is used.
Initialize the variable with snd_pcm_hw_params_get_buffer_time().
2009-03-08 04:11:30 +01:00
Max Kellermann
554a34fb95 alsa: better period_time default value for high sample rates
The default values for buffer_time and period_time were both capped by
the hardware limits on practically all chips.  The result was a
period_time which was half as big as the buffer_time.  On some chips,
this led to lots of underruns when using a high sample rate (192 kHz),
because MPD had very little time to send new samples to ALSA.

A period time which is one fourth of the buffer time turned out to be
much better.  If no period_time is configured, see how much
buffer_time the hardware accepts, and try to configure one fourth of
it as period_time, instead of hard-coding the default period_time
value.

This is yet another attempt to provide a solution which is valid for
all sound chips.  Using the SND_PCM_NONBLOCK flag also seemed to solve
the underruns, but put a lot more CPU load to MPD.
2009-03-08 03:55:01 +01:00
Max Kellermann
1063c1f2e3 alsa: log period and buffer size
Log the real period and buffer size.  This might be useful when
debugging xruns.  Note that the same information is available in
/proc/asound/card*/pcm*p/sub*/hw_params
2009-03-03 22:19:37 +01:00
Max Kellermann
0f64e658fd alsa: fall back to 32 bit samples if 16 is not supported
There are a few high-end devices (e.g. ICE1724) which cannot even play
16 bit audio.  Try the 32 bit fallback, which we already implemented
for 24 bit.
2009-03-03 09:38:20 +01:00
Max Kellermann
72176db429 alsa: fall back to 32 bit samples if 24 is not supported
Some sound chips/drivers (e.g. Intel HDA) don't support 24 bit
samples, they want to get 32 bit instead.  Now that MPD's PCM library
supports 32 bit, add a 32 bit fallback when 24 bit is not supported.
2009-03-02 16:41:38 +01:00
Max Kellermann
614fe8b341 output: removed duplicate debug messages from plugins
The MPD core logs the audio format of all audio outputs.  Remove the
duplicate message from the plugins.
2009-03-01 10:39:42 +01:00
Max Kellermann
ec926539a3 output_plugin: report errors with GError
Use GLib's GError library for reporting output device failures.

Note that some init() methods don't clean up properly after a failure,
but that's ok for now, because the MPD core will abort anyway.
2009-02-26 22:04:59 +01:00
Max Kellermann
a4cf7b7dfd alsa: fall back to 16 bit audio
When the sample format is unknown, fall back to 16 bit samples.
2009-02-25 22:01:32 +01:00
Max Kellermann
4c1fb8278b alsa: moved code from alsa_open() to alsa_setup()
Simplify error handling a bit by moving some code into a separate
function.  This eliminates a good bunch of gotos, but that's not
finished yet.
2009-02-25 22:01:30 +01:00
Max Kellermann
dcd84c19cd output_plugin: don't pass audio_output object to method init()
audio_output_get_name() has been removed, which was the only function
left in output_api.h.  The output plugin doesn't need the audio_output
object at all, remove the parameter from the init() method.
2009-02-25 18:34:02 +01:00
Max Kellermann
a4dfab2aee output: pass the music chunk pointer as void*, not char*
The meaning of the chunk depends on the audio format; don't suggest a
specific format by declaring the pointer as "char*", pass "void*"
instead.
2009-02-23 09:34:26 +01:00
Max Kellermann
5a898c15e7 output_api: play() returns a length
The old API required an output plugin to not return until all data
passed to the play() method is consumed.  Some output plugins have to
loop to fulfill that requirement, and may block during that.  Simplify
these, by letting them consume only part of the buffer: make play()
return the length of the consumed data.
2009-02-23 09:29:56 +01:00
Max Kellermann
37bc31d161 output_plugin: replaced method "control()" with "mixer()"
The output plugin shouldn't know any specifics of the mixer API.  Make
it return the mixer object, and let the caller deal with it.
2009-02-16 01:39:00 +01:00
Max Kellermann
a45922cd66 use g_free() instead of free()
On some platforms, g_free() must be used for memory allocated by
GLib.  This patch intends to correct a lot of occurrences, but is
probably not complete.
2009-01-25 18:47:21 +01:00
Max Kellermann
8695b94232 mixer: removed mixer_configure(), configure mixer in mixer_new()
Allocate the mixer object when it is configured.

Merged mixer_configure() into mixer_new().  mixer_new() was quite
useless anyway.
2009-01-25 17:37:59 +01:00
Max Kellermann
763dd8c1dd mixer: return a mixer struct pointer
Don't use statically allocated mixer objects.
2009-01-25 17:37:55 +01:00
Max Kellermann
3635c93acb conf: allow param==NULL
Return the default value in the conf_get_block_*() functions when
param==NULL was passed.

This simplifies a lot of code, because all initialization can be done
in one code path, regardless whether configuration is present.
2009-01-25 16:04:03 +01:00
Max Kellermann
5f77910097 conf: const pointers in block get functions
All config_get_block_*() functions should accept constant config_param
pointers.
2009-01-25 16:03:49 +01:00
Max Kellermann
7cc15ffc08 alsa: added comments
Document alsa_data members.
2009-01-25 13:13:24 +01:00
Max Kellermann
fb3e43ed73 alsa: frame_size is size_t, not int
frame_size is a memory size and should be a size_t, not a signed integer.
2009-01-25 13:07:06 +01:00
Max Kellermann
d887b6353f alsa: no CamelCase
Renamed types, functions, variables.
2009-01-25 13:05:16 +01:00
Dan McGee
27baf6913e alsa: fix option parsing and restore default period_time
Two bugs here led to a large number of interrupts being generated on the
sound card when ALSA output is being used. Because we specify no default
period_time, the sound card gives us 3000 interrupts/sec rather than a more
sane 20 or 30. This completes the revert of dd7711 already started by
4ca24f.

The larger bug was in the change to config_get_block_unsigned() and using 0
as the default value for both 'buffer_time' and 'period_time'. This means
any pre-setting of these options in newAlsaData() gets wiped out. Add a new
default for period_time, and ensure default values for buffer_time and
period_time are used if none are provided by the user.

Signed-off-by: Dan McGee <dan@archlinux.org>
[mk: set defaults in newAlsaData() to fix auto-configuration; renamed
"_MS" back to "_US" because ALSA expects microseconds, not milliseconds]
Signed-off-by: Max Kellermann <max@duempel.org>
2009-01-25 12:52:37 +01:00
Max Kellermann
65f2386b39 conf: added config_get_block_unsigned()
Eliminate some more getBlockParam() invocations.
2009-01-18 19:45:51 +01:00
Max Kellermann
a531a1e650 conf: added config_get_block_string()
This replaces lots of getBlockParam() invocations.
2009-01-18 19:37:27 +01:00
Max Kellermann
7acc62366c conf: replaced getBoolBlockParam() with config_get_block_bool()
No "force" parameter, pass a default value instead.
2009-01-17 20:23:56 +01:00
Max Kellermann
4d472c265e conf: no CamelCase, part I
Renamed functions, types, variables.
2009-01-17 20:23:27 +01:00
Viliam Mateicka
11c29cccb3 Introducing mixer api
This patch tryes to introduce pluggable mixer (struct mixer_plugin) along with some basic infrastructure (mixer_* functions). Instance of mixer (struct mixer) is used in
alsa and oss output plugin
2009-01-10 17:55:38 +01:00
Max Kellermann
b40428b3fd pcm_utils: moved conversion code to pcm_convert.c
All what's left in pcm_utils.h is the pcm_range() utility function,
which is only used internally by pcm_volume and pcm_mix.
2009-01-07 18:53:36 +01:00
Viliam Mateicka
1a04e57168 renaming mixer.h to mixer_api.h 2009-01-04 19:15:18 +01:00
Max Kellermann
1183236797 alsa: use GLib instead of utils.h 2009-01-02 17:56:08 +01:00
Max Kellermann
7dfe301b54 output plugins: don't include gcc.h
Use GLib's G_GNUC_UNUSED instead of gcc.h's mpd_unused.
2009-01-01 18:08:29 +01:00
Viliam Mateicka
9a70c4d06d Moving mixers to audio outputs 2008-12-31 16:46:41 +01:00
Max Kellermann
ef308d9644 alsa: use GLib logging 2008-12-29 17:29:42 +01:00
Max Kellermann
4ca24f22f1 alsa: reverted the default buffer_time to 500 ms
Commit dd7711d8 removed MPD's default ALSA buffer_time.  The result
was a buffer size which was way too small for playing streams on some
sound hardware, and caused skips and distorted sound.  Revert the
default to 500 ms.
2008-12-01 22:37:05 +01:00
Max Kellermann
9074f924e9 alsa: initialize "device" with NULL
When using autodetection, AlsaData.device wasn't properly initialized
with NULL.  This broke autodetection randomly.
2008-11-03 07:40:54 +01:00
Max Kellermann
aa33422de6 alsa, jack: no const pointers for allocated strings
Make the pointers "device" and "name" non-const, so we don't need the
xfree() hack.  The default value is expressed as NULL.
2008-11-01 14:04:14 +01:00
Max Kellermann
2f76db4c78 output: close device on play error
When an output plugin fails to play a chunk, close it.  This replaces
various manual close() calls in nearly all plugins.
2008-10-29 20:40:33 +01:00