Commit Graph

2766 Commits

Author SHA1 Message Date
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
Max Kellermann 58c5bee9f0 output: use bool for return values and flags
Don't return 0/-1 on success/error, but true/false.  Instead of int,
use bool for storing flags.
2008-10-29 20:40:27 +01:00
Max Kellermann 03390d8be1 audio: call closeAudioDevice() on error
Instead of implementing another loop which calls audio_output_close()
on all configured devices, simply call closeAudioDevice().
2008-10-29 20:39:56 +01:00
Max Kellermann 030238bb10 audio: removed variable "audioOpened"
This variable is never read, and can be removed.
2008-10-29 20:39:48 +01:00
Max Kellermann b967702059 pulse: clear pa_simple pointer in pulse_close()
The pointer becomes invalid due to pa_simple_free(), which may lead to
segmentation faults when the output is reopened later.
2008-10-29 20:38:20 +01:00
Max Kellermann d692e925a4 pulse: use GLib instead of util.h/log.h
Use GLib allocation and logging functions.
2008-10-29 20:37:36 +01:00
Max Kellermann 38df17546a pulse: no CamelCase 2008-10-29 20:37:15 +01:00
Max Kellermann 2867c8e9b1 player: handle songs shorter than the initial buffer
When the decoder exited before the buffer has grown big enough
("buffer_before_play"), the player thread waited forever.  Add an
additional check which disables buffering as soon as the decoder
exits.
2008-10-29 18:35:10 +01:00
Max Kellermann 5c4dc8d03c oss: check and override audio_format properly
Don't accept 24 bit audio.  Force MPD to use 16 bit if anything other
than 8 or 16 bit is selected.
2008-10-29 18:35:03 +01:00
Max Kellermann c6714f1755 player: added variable "play_audio_format"
The local variable "play_audio_format" is updated every time the
player starts playing a new song.  This way, we always know exactly
which audio format is current.  The old code broke when a new song had
a different format: ob.audio_format is the format of the next song,
not of the current one - using this caused breakage for the software
volume control.
2008-10-29 17:29:30 +01:00
Max Kellermann 528b7c3f5e decoder: automatically flush the output buffer after decoder exits
A decoder_flush() invocation was missing in the FLAC plugin, resulting
in casual assertion failures due to a wrong assumption about the last
chunk's audio format.  It's much easier to remove that decoder_flush()
function and make the decoder thread call ob_flush().
2008-10-29 17:29:06 +01:00
Max Kellermann 74c85811af decoder_api: make the audio_format parameter mandatory
There are no callers which pass audio_format==NULL, and it shouldn't
be allowed.
2008-10-29 17:29:03 +01:00
Max Kellermann c042faab42 player: request new song only if there is no pending command
Request the next song from the playlist (by clearing pc.next_song)
only if the player command is empty.  If it is not, the player may be
clearing the song that has already been queued, leading to an
assertion failure.
2008-10-29 17:28:49 +01:00
Max Kellermann be90199c5a decoder_api: removed decoder_clear()
Call ob_clear() in decoder_command_finished() instead of implementing
that call in every decoder plugin.
2008-10-29 17:28:47 +01:00
Max Kellermann d6c4441c78 mp3: seek in background
Remember the seek_where argument and call decoder_command_finished()
immediately.  This way, the player thread can continue working, and we
can receive more commands.

This also fixes several issues which resulted in broken frames,
leading to erroneos "elapsed" values: frames weren't parsed properly,
since the code was checking for command!=NONE.
2008-10-29 17:22:56 +01:00
Max Kellermann de588448df mp3: return from mp3_synth_and_send() on any command
Previously, the function would only return when a STOP was issued.  It
makes more sense to consider all possible commands.
2008-10-29 16:17:21 +01:00
Max Kellermann 6158858f82 mp3: moved code to mp3_synth_and_send()
Break the large function mp3_read() into smaller pieces.
2008-10-29 16:14:08 +01:00
Max Kellermann e0532ae0a8 mp3: moved code to mp3_send_pcm()
Break the large function mp3_read() into smaller pieces.
2008-10-29 16:14:02 +01:00
Max Kellermann a6ad0e4047 mp3: moved code to mp3_update_timer_next_frame()
Break the large function mp3_read() into smaller pieces.
2008-10-29 16:13:51 +01:00
Max Kellermann 0d079ee515 mp3: moved code to mp3_this_frame_offset()
Break the large function mp3_read() into smaller pieces.
2008-10-29 16:13:01 +01:00
Max Kellermann a6f8776c94 mp3: moved code to mp3_time_to_frame()
Break the large function mp3_read() into smaller pieces.
2008-10-29 16:12:26 +01:00
Max Kellermann ec3083948f mp3: assert that the stream is seekable
dc_seek() won't send a SEEK command to the decoder thread unless the
stream is seekable.  No need to do another check; convert that to an
assertion.
2008-10-29 16:11:16 +01:00
Max Kellermann 78b08f03f2 decoder_api: don't cast need_chunks() to int
need_chunks() returns a decoder_command enum.  Store its return value
as this type.
2008-10-29 16:11:15 +01:00
Max Kellermann a0b57f3782 mp3: moved code to mp3_filesize_to_song_length()
The function mp3_decode_first_frame() is too large.  Move some code to
separate smaller functions.
2008-10-28 20:44:08 +01:00
Max Kellermann 898978a67d mp3: no "goto"
http://xkcd.com/292/
2008-10-28 20:43:17 +01:00
Max Kellermann 28b47725ff mp3: use GLib allocation functions
This removes the need for util.h.
2008-10-28 20:43:15 +01:00
Max Kellermann 56ebdf1cd1 mp3: use bool
Use the C99 bool data type for boolean values.
2008-10-28 20:42:33 +01:00
Max Kellermann e4bbc120ac mp3: no CamelCase
Renamed all functions and variables.  Also removed the mp3DecodeData
typedef.
2008-10-28 20:42:01 +01:00
Max Kellermann 1f7c53e619 mp3: remove obsolete comments 2008-10-28 20:41:25 +01:00
Max Kellermann 25f98a41c4 input_file: don't use buffered I/O
Yet another superfluous buffering layer.  input_file was using FILE*,
but we're better off with unbuffered I/O using open(), read(), ...
2008-10-28 20:41:24 +01:00
Max Kellermann 0a61877702 input_stream: convert offset and size to the off_t data type
size_t and long aren't 64 bit safe (i.e. files larger than 2 GB on a
32 bit OS).  Use off_t instead, which is a 64 bit integer if compiled
with large file support.
2008-10-28 20:39:09 +01:00
Max Kellermann 016d996131 utils: use g_str_has_prefix() instead of prefixcmp()
Remove duplicated code from MPD.
2008-10-28 20:33:56 +01:00
Max Kellermann 4a71f66256 player: reset pc.command when decoder startup fails
When the decoder failed to start, the function do_play() returned,
still having pc.command==PLAY.  This is because pc.command was reset
only when the decoder started up successfully.  Add another
player_command_finished() call in the error handler.
2008-10-27 10:10:40 +01:00
Max Kellermann 0d30d51f07 input_file, input_curl: check URL type before attempting to open
Don't attempt to open a HTTP URL as a local file, and don't send a
local path to libcurl.
2008-10-27 10:10:24 +01:00
Max Kellermann 355108666c configure.ac: fix "xyes: command not found"
Due to a missing "test", the "xyes" token was interpreted as a
command.
2008-10-26 22:03:26 +01:00
Max Kellermann 0800c6f4ca output: don't compile plugins which are disabled
Don't compile the sources of disabled output plugins at all.
2008-10-26 21:58:37 +01:00
Max Kellermann 3dac99034a dirvec: fixed GCC shadow warning
On some systems, string.h declares basename().  This emits a shadow
warning.  Change the variable name.
2008-10-26 21:28:16 +01:00
Max Kellermann 5f2384001e curl: read stream name from HTTP response headers
If the server sends the headers "icy-name", "ice-name",
"x-audiocast-name", set the stream title.
2008-10-26 21:20:02 +01:00
Max Kellermann 5d9ef0cd83 input_curl: set input_stream.mime from Content-Type response header 2008-10-26 21:19:32 +01:00
Max Kellermann 1437a56a11 input_curl: added local variable "value"
Replaced the local variable "colon" (which had only temporary meaning)
with the variable "value".  It is a pointer to the first byte of the
header value.
2008-10-26 21:12:56 +01:00
Max Kellermann d401589edf input_stream: use g_free() in input_stream_close()
g_free() allows passing the NULL pointer.
2008-10-26 21:02:49 +01:00
Max Kellermann 5c19776f2f input_stream: use "bool" instead of "int"
For boolean values and success flags, use bool instead of integer (1/0
for true/false, 0/-1 for success/failure).
2008-10-26 20:56:46 +01:00
Max Kellermann 464b611772 input_stream: input_stream_close() returns void
close() shouldn't fail with read-only streams.
2008-10-26 20:54:52 +01:00
Max Kellermann f08041f0eb input_stream: added struct input_plugin
Instead of managing a set of method pointers in each input_stream
struct, move these into the new input_plugin struct.  Each
input_stream has only a pointer to the plugin struct.  Pointers to all
implementations are kept in the array "input_plugins".
2008-10-26 20:38:44 +01:00
Max Kellermann dbc7e9ba2f input_stream: no CamelCase
Renamed all functions and variables.
2008-10-26 20:34:47 +01:00
Max Kellermann 97a9c7a8e0 input_file: removed global constructor
The global constructor is empty, and can be removed.
2008-10-26 20:34:33 +01:00
Max Kellermann 23552f89cc input_file: don't export internal methods
The methods are only used in inputStream_fileOpen(), and should not be
exported.
2008-10-26 20:34:03 +01:00
Max Kellermann 21b8590b53 input_stream: removed the InputStream typedef
Everybody should use struct input_stream.
2008-10-26 19:54:57 +01:00
Max Kellermann bbaedb17d5 input_stream: renamed sources, no CamelCase
Renamed inputStream.c and inputStream_file.c.
2008-10-26 19:38:50 +01:00
Max Kellermann 3609de8685 http: use libcurl
MPD's HTTP client code has always been broken, no matter how effort
was put into fixing it.  Replace it with libcurl, which is known to be
quite stable.  This adds a fat library dependency, but only for people
who need streaming.
2008-10-26 19:32:43 +01:00