Max Kellermann
2124df1390
decoder: rewind input stream after try_decode()
...
The try_decode() method may have read some data from the stream, which
is now lost. To make this data available to other methods, get it
back by rewinding the input stream after each try_decode() invocation.
The ogg and wavpack plugins did this manually and inconsistently; this
code can now be removed.
2008-11-02 17:10:02 +01:00
Max Kellermann
395aa4e847
decoder: moved code to decoder_try_decode()
2008-11-02 17:07:39 +01:00
Max Kellermann
5183d85886
player: send chunk tag to audio device
...
If a chunk contains a tag, send it to the audio output device. Few
output plugins support this, e.g. shout has support for sending tags.
2008-11-02 17:07:31 +01:00
Max Kellermann
aa9b31f1cf
crossfade: copy tag
...
If the source chunk has a tag, merge it into the destination chunk.
The source chunk gets deleted after that, and this is our last chance
to grab the tag.
2008-11-02 17:07:13 +01:00
Max Kellermann
0f80428fda
ffmpeg: use decoder_read() wrapper instead of direct input_stream_read()
...
decoder_read() checks the decoder command. Without this patch, the
ffmpeg plugin could become unresponsive.
2008-11-02 17:06:53 +01:00
Max Kellermann
4d069b4991
ogg, ffmpeg: try to decode, even when the stream is not seekable
...
Ogg and ffmpeg detection was disabled when the stream was not
seekable, because the detection was too expensive. Since the curl
input stream can now rewind the stream cheaply, we can re-enable
detection on streams.
2008-11-02 17:06:32 +01:00
Max Kellermann
460b15d29c
input_curl: buffered rewinding
...
During codec detection, the beginning of the stream is consumed. This
is a common operation, which takes a lot of time when handling remote
resources. To optimize this, remember the first 64 kB of a stream.
This way, we can rewind the stream without actually fetching the start
of the stream again.
2008-11-02 17:06:15 +01:00
Max Kellermann
020c04e702
decoder_api: added decoder_tag()
...
Provide an API for submitting additional tags from the stream.
2008-11-02 17:02:28 +01:00
Max Kellermann
5b13f067cd
aac, mod: moved decoder command check into loop condition
...
Avoid while(true) loops, and convert them to a loop with a proper
condition.
2008-11-02 17:02:23 +01:00
Max Kellermann
3f6fcfd38e
aac, mod: don't check for SEEK command
...
Since the aac and mod plugins have told MPD that they cannot seek, MPD
will never send a SEEK command to them. Removed the SEEK comand
checks from both plugins.
2008-11-02 17:02:00 +01:00
Max Kellermann
c9e15bc418
decoder_api: pass "seekable" flag to decoder_initialized()
...
Don't pass the "seekable" flag with every decoder_data() invocation.
Since that flag won't change within the file, it is enough to pass it
to decoder_initialized() once per file.
2008-11-02 17:01:51 +01:00
Max Kellermann
c7a374bdcb
music_pipe: add tag pointer to the music_chunk struct
...
Each music chunk can now carry a tag object. Decoder plugins which
support it (e.g. oggvorbis) may use this to inject decoded tags into
their output.
2008-11-02 17:01:00 +01:00
Max Kellermann
fcc11bc9d8
music_pipe: added functions chunk_init() and chunk_free()
...
These two functions will care about memory allocation and deallocation
in the future.
2008-11-02 16:58:49 +01:00
Max Kellermann
85b6ff7b59
music_pipe: document struct music_chunk
...
Add doxygen compatible comments.
2008-11-02 16:58:45 +01:00
Max Kellermann
b42dad9b05
music_pipe: removed "volatile"
...
The "volatile" keyword doesn't help here, because we have proper
memory barriers, but it disables some optimizations. Remove it.
2008-11-02 16:58:42 +01:00
Max Kellermann
39bf84aa9f
music_pipe: renamed "size" to "num_chunks"
...
The name "num_chunks" expresses the meaning of the variable better.
2008-11-02 16:57:37 +01:00
Max Kellermann
5347cca29d
music_pipe: no CamelCase
...
Rename all variables and struct members.
2008-11-02 16:57:16 +01:00
Max Kellermann
8490c1b4cf
music_pipe: set bit_rate and time in music_pipe_append()
...
Don't bother to pass these values as parameters to tail_chunk().
2008-11-02 16:57:15 +01:00
Max Kellermann
cd61f6570f
music_pipe: moved code to music_chunk_append()
2008-11-02 16:56:49 +01:00
Max Kellermann
e9e9d2bc2d
music_pipe: renamed "ob" to "music_pipe"
...
Last music_pipe rename patch: renamed the global variable (singleton).
2008-11-02 16:56:09 +01:00
Max Kellermann
d430b1dc54
music_pipe: more wrapper functions
...
Replace all direct music_pipe struct accesses with wrapper functions.
The compiled machine code is the same, but this way, we can change
struct internals more easily.
2008-11-02 16:55:53 +01:00
Max Kellermann
260a0cc33c
music_pipe: use GLib instead of utils.h
...
Eliminate the deprecated utils.h memory allocation functions.
2008-11-02 16:55:48 +01:00
Max Kellermann
8b1f6ff3c8
decoder: replaced music_pipe.audioFormat with dc.out_audio_format
...
.. and rename dc.audioFormat to dc.in_audio_format. The music pipe
does not need to know the audio format, and its former "audioFormat"
property indicated the format of the most recently added chunk, which
might be confusing when you are reading the oldest chunks.
2008-11-02 16:55:43 +01:00
Max Kellermann
30fca5e5a9
music_pipe: pass frame size to tail_chunk()
...
Don't make tail_chunk() calculate the frame size again.
2008-11-02 14:18:34 +01:00
Max Kellermann
fd0f195bb7
music_pipe: renamed ob_* functions to music_pipe_*
...
Rename all functions to the new prefix.
2008-11-02 14:18:34 +01:00
Max Kellermann
8964c69a64
music_pipe: renamed struct output_buffer to struct music_pipe
...
.. and rename ob_chunk to struct music_chunk.
2008-11-02 14:15:47 +01:00
Max Kellermann
767b4c95bd
renamed outputBuffer.[ch] to pipe.[ch]
...
No CamelCase in the file name. The output_buffer struct is going to
be renamed to music_pipe. There are so many buffer levels in MPD, and
calling this one "output buffer" is wrong, because it's not the last
buffer before the music reaches the output devices.
2008-11-02 14:12:52 +01:00
Max Kellermann
b48ae8c26f
decoder: enable decoders even if they have no init() method
...
Commit 1a4a3e1f
moved decoders into a static array, but failed to
enable those plugins who did not have an init() method at all.
This patch corrects the "enabled" check.
2008-11-02 13:30:26 +01:00
Max Kellermann
4c1b96c307
decoder: make the suffixes and mime_types arrays really const
...
The strings were constant, but the pointers weren't. C syntax is
somewhat tricky..
2008-11-01 14:55:23 +01:00
Max Kellermann
0b614fbaae
decoder: make all decoder_plugin structs const
...
All decoder_plugin structs are initialized at compile time, and must
never change.
2008-11-01 14:54:09 +01:00
Max Kellermann
1a4a3e1f1f
decoder: manage decoder list in a static array
...
Currently, there is no way to dynamically load decoder plugins, thus
we don't need a dynamic list to manage them.
2008-11-01 14:53:30 +01:00
Max Kellermann
5036368f54
decoder: return const decoder_plugin structs
...
The decoder_plugin structs must never change. Don't work with
non-const pointers.
2008-11-01 14:51:41 +01:00
Max Kellermann
83f6222ae7
permission: store passwords in GHashTable
...
Eliminating the deprecated linked list library.
2008-11-01 14:33:25 +01:00
Max Kellermann
aa772ebc02
tag: use GLib instead of utils.h
...
Don't use the deprecated functions from utils.h.
2008-11-01 14:33:14 +01:00
Max Kellermann
35710a81ea
utils: use GUINT32_FROM_LE() instead of readLEuint32()
...
Eliminate code already provided by GLib.
2008-11-01 14:11:19 +01:00
Max Kellermann
b996108675
tag: don't return const string from fix_utf8()
...
Return NULL instead of the input value if there is nothing to fix.
This way, the caller doesn't have to use the xfree() hack.
2008-11-01 14:04:15 +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
9fdac529b4
path: removed sanitizePathDup()
...
We don't need to sanitize the path, because the mapper already checks
for malformed paths.
2008-10-31 16:50:51 +01:00
Max Kellermann
f291876772
mapper: check for "." and ".."
...
Make map_directory_child_fs() refuse the names "." and "..". This is
currently the interface where an attacker may inject a manipulated
path (through the "update" command).
2008-10-31 16:48:58 +01:00
Max Kellermann
a5f8d4386c
update: check return values
...
Nearly all mapper functions can fail and will then return NULL. Add
checks to all callers.
2008-10-31 16:47:21 +01:00
Max Kellermann
d8e877e335
path: moved playlist_dir to mapper.c
...
Added the function map_spl_utf8_to_fs() which replaces
utf8_to_fs_playlist_path().
2008-10-31 16:47:14 +01:00
Max Kellermann
ef54271619
mapper: use g_warning() for logging
...
g_error() is fatal by default. Use g_warning() for non-fatal
initialization errors.
2008-10-31 16:46:46 +01:00
Max Kellermann
f098db149e
decoder: eliminate gotos in decodeStart()
...
http://xkcd.com/292/
2008-10-31 16:29:45 +01:00
Max Kellermann
a1ca32168c
decoder: don't wake up player when command==NONE
...
If nobody sent a command, the player isn't waiting for the decoder.
Don't wake it up.
2008-10-31 16:29:39 +01:00
Max Kellermann
63682eb1b8
decoder: notify player after stop
...
The player should always be woken up when the decoder quits.
2008-10-31 16:29:34 +01:00
Max Kellermann
347e816247
decoder: reset state and command in decoder_task()
...
Eliminate one goto in decodeStart() by moving some cleanup to
decoder_task().
2008-10-31 16:29:24 +01:00
Max Kellermann
86fbac54fd
decoder: introduce switch statement in decoder_task()
...
switch looks much nicer than if/elseif/... and gcc generates nice
warnings when a new command is added to the enum.
2008-10-31 16:29:22 +01:00
Max Kellermann
78448fe1a5
decoder_api: pass constant path pointers
2008-10-31 15:56:43 +01:00
Max Kellermann
6d6e615825
input_stream: pass const url to input_stream_open()
2008-10-31 15:50:59 +01:00
Max Kellermann
a92903983d
client: use bool
...
Return bool instead of int.
2008-10-31 13:58:00 +01:00
Max Kellermann
6757c17689
removed UTF-8 library, use GLib instead
...
Removed duplicated code.
2008-10-31 13:57:10 +01:00
Alam Arias
78f60c9c6d
removed unneed check for protocol in shout plugin, will assume icecast2 protocol if not exist in config
2008-10-31 12:20:49 +01:00
Max Kellermann
71fe7ad81a
path: free GLib error in fs_charset_to_utf8()
...
g_error_free() was missing in case g_convert() failed.
2008-10-31 12:20:48 +01:00
Max Kellermann
8f9d9cc042
directory: directory_free() frees children
...
directory_free() should free all of its children (subdirectories and
songs). This way, db_finish() properly frees all allocated memory.
2008-10-31 09:20:02 +01:00
Max Kellermann
ea515494cb
added prefix to header macros
...
"LOG_H" is a macro which is also used by ffmpeg/log.h. This is
ffmpeg's fault, because short macros should be reserved for
applications, but since it's always a good idea to choose prefixed
macro names, even for applications, we are going to do that in MPD.
2008-10-31 09:19:53 +01:00
Max Kellermann
5ef17ac1aa
client: don't try again after partial write
...
After a partial write, chances are vanishing that another write() will
succeed. Don't try immediately.
2008-10-31 09:19:40 +01:00
Max Kellermann
b7ee6febaa
removed the sllist library
...
The "simple singly-linked-list" library has been replaced with GLib's
GList and GQueue.
2008-10-31 09:19:34 +01:00
Max Kellermann
94cbdffb72
client: use GQueue instead of sllist.h for deferred_send
...
Another custom data structore converted to GLib.
2008-10-31 09:18:11 +01:00
Max Kellermann
90e9079142
client: use GSList instead of struct strnode for command lists
...
Replace a custom data structure with a GLib one.
2008-10-31 09:17:56 +01:00
Max Kellermann
e5ef2d8a37
client: removed list_cache
...
The list cache aims to save memory allocations, and complicates the
code a bit. We should rather use GLib slices later, which are easy to
use.
2008-10-31 09:17:52 +01:00
Max Kellermann
8f37f7c838
ogg: don't include _flac_common.h
...
The source _ogg_common.c does not need any symbols from
_flac_common.h, but including it leads to compiler errors when libflac
isn't available.
2008-10-31 08:52:09 +01:00
Max Kellermann
d65d6548a3
oggflac: adapt to new API
...
Again, I forgot to adapt oggflac to the new API (struct input_stream,
bool return values).
2008-10-31 08:52:09 +01:00
Max Kellermann
5024f0b6cc
ffmpeg: pass input_stream pointer to decoder_data()
...
decoder_data() uses wait times to let the input stream continue its
transfer.
2008-10-30 19:09:20 +01:00
Max Kellermann
b15c4cdeb5
ffmpeg: use return value of decoder_data()
...
decoder_data() always returns the current command. If we use this, we
can save a lot of decoder_get_command() calls.
2008-10-30 19:03:41 +01:00
Max Kellermann
f3b4a28518
ffmpeg: output buffer size cannot be negative
...
Converted the runtime check to an assertion.
2008-10-30 19:03:38 +01:00
Max Kellermann
130fc58b36
ffmpeg: break immediately after av_read_frame()
...
Remove one indent level.
2008-10-30 19:03:31 +01:00
Max Kellermann
5f1df0a927
ffmpeg: moved code to ffmpeg_send_frame()
...
Move code from ffmpeg_decode_internal() to make it smaller and more
readable.
2008-10-30 19:03:20 +01:00
Max Kellermann
048d62a628
ffmpeg: report seek errors to MPD
...
The decoder API provides the function decoder_seek_error() to report
seek errors. Use this function instead of logging the error.
2008-10-30 19:02:38 +01:00
Max Kellermann
cd7a720426
ffmpeg: simplified mpdurl_read()
...
The function mpdurl_read() is too complicated, and uses the wrong data
types.
2008-10-30 19:02:01 +01:00
Max Kellermann
964442c5ad
ffmpeg: call tag_free() instead of free()
...
tag objects must be freed with tag_free() to ensure that all resources
are freed.
2008-10-30 19:01:36 +01:00
Max Kellermann
25f4efcdb8
ffmpeg: eliminated local variable "tag"
...
The function ffmpeg_tag() already has the variable base.tag, which can
be used for this.
2008-10-30 19:01:31 +01:00
Max Kellermann
7cbd9821c6
ffmpeg: make ffmpeg_helper() return bool
...
ffmpeg_try_decode() did not interpret ffmpeg_helper()'s return value
properly; migrate everything to bool to make it consistent.
2008-10-30 19:01:23 +01:00
Max Kellermann
078d83ca13
ffmpeg: removed debug messages
...
We don't need those anymore, they just fill the log.
2008-10-30 19:01:18 +01:00
Max Kellermann
b180d0b47f
ffmpeg: initialize base.decoder
...
ffmpeg_tag() did not initialize base.decoder, which made valgrind
unhappy, and can lead to a egmentation fault.
2008-10-30 18:08:52 +01:00
Max Kellermann
4d72bda4c3
listen: set file mode 666 on the unix socket
...
Depending on MPD's umask, the file permissions of the unix socket were
too restrictive, and many clients were not able to connect. Do a
chmod(0666) on the socket, to allow everybody to connect.
2008-10-30 18:03:18 +01:00
Max Kellermann
9ec695559f
pulse: fix segfault without sink name
...
Commit d692e9 broke configurations without explicit server or sink
configuration. Check for getBlockParam()==NULL.
2008-10-30 17:46:56 +01:00
Max Kellermann
5f6383d68c
mpc: provide 24 bit samples
...
Similar to libmad, libmpcdec provides samples with higher quality than
16 bit. Send 24 bit samples to MPD, which allows MPD to apply
dithering just in case the output devices are only 16 bit capable.
2008-10-30 08:45:00 +01:00
Max Kellermann
0db07a920e
mpc: moved sample size into a constant
...
Don't hard-code the "16 bits" or "2 bytes" in multiple locations.
2008-10-30 08:44:51 +01:00
Max Kellermann
6773dea5b0
mpc: renamed variable "s16" to "dest"
...
The name "s16" implies 16 bit integers. To make the code more
generic, rename it to "dest".
2008-10-30 08:44:43 +01:00
Max Kellermann
51348d6992
mpc: fix broken integer sample conversion
...
The conversion of integer samples was completely broken, which
presumably didn't annoy anybody because libmpcdec provides float
samples on most installations.
2008-10-30 08:44:28 +01:00
Max Kellermann
ecd485acbd
mpc: fix boolean interpretation of input_stream_seek()
...
When input_stream_seek() was converted to return a bool, this wasn't
adjusted in the musepack plugin.
2008-10-30 08:42:18 +01:00
Max Kellermann
62d4fa9306
decoder: 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-30 08:38:54 +01:00
Max Kellermann
d29bad4410
mp3: make mp3_read() return bool
...
Its only caller in mp3_decode() just compared its value with
DECODE_BREAK. Convert that to bool, and return false if the loop
should be ended. Also eliminate some superfluous command checking
code, which was already done in the preceding while loop.
2008-10-30 06:09:28 +01:00
Max Kellermann
f8722913cf
output: removed audio_output.result
...
Since open() and play() close the device on error, we can simply check
audio_output.open instead of audio_output.result after a call.
2008-10-29 22:34:37 +01:00
Max Kellermann
7da0e005f3
output: delay reopen after device failure
...
When one of several output devices failed, MPD tried to reopen it
quite often, wasting a lot of resources. This patch adds a delay:
wait 10 seconds before retrying. This might be changed to exponential
delays later, but for now, it makes the problem go away.
2008-10-29 22:32:50 +01:00
Max Kellermann
0eae1c55ad
output: moved code to audio_output_update()
...
Moved code from syncAudioDeviceStates() to audio_output_update().
2008-10-29 22:17:44 +01:00
Max Kellermann
678314534a
output: always call cancel() before stop()
...
Stopping an audio output device without cancelling its buffer doesn't
make sense. Combine the two operations, which saves several cancel
calls.
2008-10-29 22:17:42 +01:00
Max Kellermann
07bb46de88
input_file: refuse to open non-regular files
...
Don't allow users to open a file which is non-regular (e.g. pipes,
devices).
2008-10-29 21:11:28 +01:00
Max Kellermann
84f7d9c6b3
input_file: check fstat() failure
2008-10-29 21:11:20 +01:00
Max Kellermann
fb08213659
input_file: use GLib for logging
2008-10-29 21:11:04 +01:00
Max Kellermann
8f3d962219
log: don't use utils.h
...
Prefer GLib over utils.h.
2008-10-29 21:02:22 +01:00
Max Kellermann
cf376b4bc8
output: moved audioDeviceStates to audio_output.enabled
2008-10-29 20:49:51 +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
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