Commit Graph

3403 Commits

Author SHA1 Message Date
Max Kellermann
f6e5c00726 shout: use the new encoder API
Removed shout's encoder plugin API in favor of the new generic encoder
plugin API.
2009-02-22 17:18:28 +01:00
Max Kellermann
f7c685f1ab encoder: added lame mp3 encoder
This new LAME encoder plugin is based on the existing shout_mp3.c
plugin.
2009-02-22 17:18:03 +01:00
Max Kellermann
3a6619d62c encoder: added vorbis encoder
This new vorbis encoder plugin is based on the existing shout_ogg.c
plugin.
2009-02-22 17:17:26 +01:00
Max Kellermann
a9dde676be added the encoder API
The new generic encoder API will replace shout's custom encoder API.
2009-02-22 17:11:14 +01:00
Max Kellermann
e79a82ba3a shout: merged open_shout_conn() into my_shout_open_device()
The method implementation my_shout_open_device() consists of only one
line, the call to open_shout_conn().  Merge both functions into one.
2009-02-22 15:24:41 +01:00
Max Kellermann
cece6c00f4 shout: bool return values instead of int
Return true/false instead of 0/-1.
2009-02-22 15:18:58 +01:00
Max Kellermann
f0554d9a75 pcm: added API documentation 2009-02-21 18:14:20 +01:00
Max Kellermann
cae7c160a3 crossfade: added API documentation 2009-02-20 14:57:32 +01:00
Max Kellermann
91ebf46853 path: don't export path_set_fs_charset()
The function path_set_fs_charset() is only used in path.c.
2009-02-20 14:49:57 +01:00
Max Kellermann
09ecfb6567 path: validate configured character set 2009-02-20 12:31:00 +01:00
Max Kellermann
adea76a6ed decoder_api: fixed shadow warning, rename "wait"
The parameter name "wait" overlaps with the POSIX wait() function.
Rename it.
2009-02-19 13:33:06 +01:00
Max Kellermann
e7131b5da2 utils: use g_usleep() instead of my_usleep()
Now that I've found this nice function in the GLib docs, we can
finally remove our custom sleep function.  Still all those callers of
g_usleep() have to be migrated one day to use events, instead of
regular polling.
2009-02-19 13:33:03 +01:00
Max Kellermann
c228635489 faad: use faacDecFrameInfo instead of NeAACDecFrameInfo
Don't use libfaad's internal type names.
2009-02-19 13:29:15 +01:00
Max Kellermann
eac2da635d added G_LOG_DOMAIN macros to several libraries
Define the GLib logging domain in the following libraries: conf,
daemon, event_pipe, log.
2009-02-19 09:24:59 +01:00
Max Kellermann
11e680d640 conf: log the effective configuration file name
For better debugging aid when something goes wrong, log the name of
the effective configuration file.
2009-02-19 08:35:22 +01:00
Max Kellermann
0a0736fc4e log: added log_early_init() for early debug messages 2009-02-19 08:35:20 +01:00
Max Kellermann
84437acffb Makefile.am: add new headers to $(mpd_headers)
I forgot to add these, and this broke "make distcheck".
2009-02-19 08:12:46 +01:00
Peter Colberg
de6cc2691f mms: fix assertion in input_stream_open
Hi,

upon trying to play an MMS stream added to the play list, I got this:

    mpd: /tmp/mpd/./src/input_stream.c:85: input_stream_open: Assertion `is->plugin->open == ((void *)0) || is->plugin == plugin' failed.

With the following patch applied, it works perfectly.

Thanks for having implemented MMS support :-).

Best regards,
Peter
2009-02-19 07:34:07 +01:00
Max Kellermann
7f701744a7 pcm_volume: optimized pcm_volume_change_24() on i386
Added an inline assembly function for the 64 bit multiplication.

Benchmark results on a Pentium II 266 MHz, 512 MB of 24 bit PCM data:

 dd if=/dev/zero bs=64k count=8k |
     time ./test/software_volume 48000:24:2 >/dev/null

Before this patch 22.94s, after this patch 7.24s.
2009-02-18 22:27:58 +01:00
Max Kellermann
fcf65de46b mp4ff: always free the mp4ff_read_sample() buffer
When mp4ff_read_sample() returns a value bigger than zero, it
guarantees that the buffer is set.  Remove the check.
2009-02-18 19:08:52 +01:00
Max Kellermann
5900ea5299 mp4ff: don't allocate seek_table when input is not seekable
Don't waste any precious memory when the seek_table cannot be used.
2009-02-18 18:40:40 +01:00
Max Kellermann
8aa3edb6af mp4ff: include cleanup
Don't include limits.h, use GLib constants instead.
2009-02-18 18:40:33 +01:00
Max Kellermann
51c59f6228 mp4ff: use faacDecInit2() to find the AAC track
Use faacDecInit2() instead of AudioSpecificConfig() to detect the AAC
track in the MP4 file.  This has a great advantage: it initializes the
libfaad decoder, which the caller would normally do anyway - but now
we can go without the AudioSpecificConfig() call.  When decoder==NULL
(called from mp4_tag_dup()), fall back to a mp4ff_get_track_type()==1
check, like other audio players do.
2009-02-18 18:39:12 +01:00
Max Kellermann
111c73e701 mp4ff: moved code to mp4_faad_new()
Moved the libfaad decoder initialization to mp4_faad_new(), and also
fill the audio_format struct there.  This eliminates a little bit of
complexity in mp4_decode().
2009-02-18 18:38:09 +01:00
Max Kellermann
2bc0fabe73 mp4ff: call decoder_initialized() after libfaad initialization
Don't wait for the first frame to be decoded.  We already have the
sample rate and the channel count from faacDecInit2().
2009-02-18 18:18:29 +01:00
Max Kellermann
47e3eab872 mp4ff: merged mp4_load_tag() into mp4_tag_dup()
The function mp4_load_tag() is used only once, and mp4_tag_dup() is a
one-liner.  Merge them.
2009-02-18 18:18:25 +01:00
Max Kellermann
9d2f16d827 player_thread: don't drop audio buffers when not seekable
When a file is not seekable, MPD dropped the audio buffers before even
attempting to seek.  This caused noticable sound corruption.  Fix:
first attempt to seek, and only if that succeeds, call
audio_output_all_cancel().
2009-02-17 23:57:10 +01:00
Max Kellermann
4aca1fa493 faad: variable cleanup
Make some variables more local, and eliminate superfluous ones.
2009-02-17 23:44:29 +01:00
Max Kellermann
122e0f3338 faad: added source code comments 2009-02-17 23:42:06 +01:00
Max Kellermann
76b0601f6b faad: faad_decoder_init() returns an audio_format
Instead of returning the sample rate and channel count as separate
values, fill an audio_format struct.
2009-02-17 23:35:49 +01:00
Max Kellermann
161bfc4bc0 faad: call decoder_initialized() after libfaad initialization
Don't wait for the first frame to be decoded.  We already have the
sample rate and the channel count from faacDecInit().
2009-02-17 23:26:51 +01:00
Max Kellermann
a72c7a7b18 faad: removed DECODE_COMMAND_SEEK check
The MPD core will never send a SEEK command to a decoder which has
declared to be not seekable.
2009-02-17 23:20:16 +01:00
Max Kellermann
9245bd0c69 input_file, input_curl, icy_metadata: added GLib log domains
Define G_LOG_DOMAIN.
2009-02-17 22:58:27 +01:00
Max Kellermann
7b84f1e6b3 faad: use the decoder_buffer library
Replace this plugin's own buffer library with the new decoder_buffer
library.
2009-02-17 22:56:42 +01:00
Max Kellermann
7cea5357e3 faad: check the result of adts_find_frame()
Instead of checking if the buffer is empty after adts_find_frame(),
check adts_find_frame()'s return value.  This is more robust.
2009-02-17 22:56:07 +01:00
Max Kellermann
77db32f8fb faad: added libfaad wrappers
Moved libfaad API quirks to the wrapper functions faad_decoder_init()
and faad_decoder_decode().
2009-02-17 22:54:26 +01:00
Max Kellermann
6a72db22d7 faad: functions return duration, no float pointer
Instead of writing the song duration into a float pointer, return it
from the function.
2009-02-17 22:54:01 +01:00
Max Kellermann
e30ba2e4cf faad: removed length==NULL check in faad_song_duration()
There are no callers which pass NULL here.
2009-02-17 22:53:28 +01:00
Max Kellermann
867ae1cf6f faad: fill buffer in adts_find_frame()
All callers of adts_find_frame() use faad_buffer_fill() before that.
Move that faad_buffer_fill() call into adts_find_frame() instead.
adts_find_frame() will get its own logic for on-demand filling.
2009-02-17 22:53:25 +01:00
Max Kellermann
1a9756156e added the "decoder buffer" library
The decoder buffer library may be used by decoder libraries such as
"faad".
2009-02-17 22:39:45 +01:00
Max Kellermann
66b4a3ab2e faad: converted length check to assertion in adts_check_frame()
adts_check_frame() must not be called with a buffer length smaller
than 8.  We can eliminate that duplicate check, and convert it into an
assertion.
2009-02-17 19:28:11 +01:00
Max Kellermann
8edd407918 faad: added length check before comparing "ADIF"
It's not valid to use the buffer's data without ensuring that the
buffer contains enough data.
2009-02-17 19:27:36 +01:00
Max Kellermann
d75ce5c4a0 faad: renamed internal functions
"aac" -> "faad"
2009-02-17 19:27:01 +01:00
Max Kellermann
943b17c99a wavpack: added GLib log domain 2009-02-17 19:26:36 +01:00
Max Kellermann
656d5c9c7b pcm_convert: removed pcm_convert_size()
The function is unused, since we added the pcm_buffer library.
2009-02-17 19:26:32 +01:00
Max Kellermann
ac3e2de28b pcm_buffer: set size after allocation
When I implemented the pcm_buffer library, I forgot to set the new
buffer size.  This caused a new allocation in each pcm_buffer_get(),
fortunately no memory was leaked.
2009-02-17 18:27:00 +01:00
Max Kellermann
d8db46edfa decoders: added and fixed GLib log domains
Fixed the log domains of the renamed decoders.  Added G_LOG_DOMAIN
macros in decoders which don't have one already.
2009-02-17 08:51:34 +01:00
Max Kellermann
c4d69f0ae1 renamed decoder plugin "mpc" to "mpcdec"
This plugin is based on "libmpcdec".
2009-02-17 08:48:20 +01:00
Max Kellermann
70523657bf renamed decoder plugin "mp4" to "mp4ff"
This plugin is based on "libmp4ff".
2009-02-17 08:45:26 +01:00
Max Kellermann
f4ff7eab9d tag: fixed typo in MUSICBRAINZ_TRACKID tag name 2009-02-17 06:48:57 +01:00
Max Kellermann
68314c33e9 faad: no CamelCase
Renamed functions and variables.
2009-02-16 19:31:11 +01:00
Max Kellermann
8d2e6bf54c faad: removed AacBuffer.fileOffset
The element fileOffset is only written, but never read.  It can be
removed safely.
2009-02-16 19:31:08 +01:00
Max Kellermann
c6205bd461 renamed decoder plugin "oggvorbis" to "vorbis"
This plugin uses libvorbis.
2009-02-16 19:31:06 +01:00
Max Kellermann
cafaf33aa8 renamed decoder plugin "aac" to "faad"
A decoder plugin should be named after the library which is used.
2009-02-16 19:30:54 +01:00
Max Kellermann
c5edb53797 renamed decoder plugin "mp3" to "mad"
A decoder plugin should be named after the library which is used.
2009-02-16 19:30:45 +01:00
Max Kellermann
585f81ece1 output_api: don't include config.h
If an output plugin requires config.h, it should include it directly.
2009-02-16 18:41:30 +01:00
Max Kellermann
02c99d7716 mixer: include cleanup
Don't include conf.h in mixer_api.h.  Use a forward struct declaration
instead.
2009-02-16 18:40:04 +01:00
Max Kellermann
46c15e4ab3 output: include cleanup
Don't include output_api.h in output_internal.h.  This change requires
adding missing includes in several sources.
2009-02-16 01:51:50 +01:00
Max Kellermann
83ce0e5325 mixer_api: replaced method "control()" with "{get,set}_volume()"
The method control() is too complicated, and overengineered.  Replace
it with two trivial functions: get_volume() and set_volume().
2009-02-16 01:39:52 +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
79b50b7d9c output_plugin: added inline wrapper functions
Similar to the decoder plugin API: added wrapper functions to increase
code readability.
2009-02-16 01:38:10 +01:00
Max Kellermann
67da4cfe3c output_plugin: reorder method declarations
Initialization and deinitialization first, then tag functions, then
play/cancel/pause.
2009-02-16 01:38:09 +01:00
Max Kellermann
80702fa3a2 output_api: moved "struct audio_output_plugin" to output_plugin.h
If we move the plugin struct to a separate header, we don't have to
include the big fat output_api.h everywhere.
2009-02-16 01:37:42 +01:00
Max Kellermann
a5c0394007 output_api: moved "enum output_command" to output_internal.h
Now that the output_command enum isn't exposed to output plugins
anymore, we can hide its definition within output_internal.h.
2009-02-16 00:43:12 +01:00
Max Kellermann
3a82283b19 output_control: no CamelCase
Renamed variables.
2009-02-16 00:43:06 +01:00
Max Kellermann
ed591f19ef wildmidi: check if configurationn file exists
Don't call WildMidi_Init() if the configuration file does not exist.
Don't let libwildmidi clutter stderr with its warning message.
2009-02-15 18:41:05 +01:00
Max Kellermann
5c68f91dae wildmidi: obtain timidity.cfg location from mpd.conf 2009-02-15 18:41:03 +01:00
Max Kellermann
1f88cd73d4 decoder_list: added configuration option to disable decoder plugins 2009-02-15 18:40:47 +01:00
Max Kellermann
6cfacc778c decoder_list: added configuration block "decoder"
The "decoder" configuration block may contain the configuration of one
decoder plugin.
2009-02-15 18:35:19 +01:00
Max Kellermann
dec5d48f80 decoder_plugin: pass struct config_param to init() method
Preparing for per-plugin configuration sections in mpd.conf.
2009-02-15 18:34:14 +01:00
Max Kellermann
900784bb4e decoder_api: moved enum decoder_command to decoder_command.h
Minimize header dependencies, again.
2009-02-15 18:33:31 +01:00
Max Kellermann
3e3c524264 decoder_plugin: added inline wrapper functions
Increase code readability, always use the wrapper functions instead of
calling the plugin method pointers directly.
2009-02-15 18:33:28 +01:00
Max Kellermann
a28287073b decoder_api: moved struct decoder_plugin to decoder_plugin.h
The decoder_plugin struct is used by both the MPD core and the decoder
plugin implementations.  Move it to a shared header file, to minimize
header dependencies.
2009-02-15 17:48:37 +01:00
Max Kellermann
92c203d705 daemon: return early from daemonize_set_user()
If no "user" is configured, return from daemonize_set_user().  Save
one level of indent.
2009-02-15 16:58:52 +01:00
Max Kellermann
98994c5939 daemon: ignore "user" setting if already running as that user
If mpd.conf specifies a user, and MPD is invoked by exactly this user,
ignore the "user" setting.  Don't bother to look up its groups and
don't attempt to change uid, it won't work anyway.
2009-02-15 16:47:21 +01:00
Max Kellermann
59e62d95bd daemon: added comments to daemonize_detach() 2009-02-15 16:28:39 +01:00
Max Kellermann
42415592b4 daemon: print fork error message
Print details on why the fork() fails.
2009-02-15 16:27:50 +01:00
Max Kellermann
fd8c63b619 daemon: moved code to daemonize_detach()
Moved the code which detaches from the parent process/session to a
separate function.
2009-02-15 16:27:09 +01:00
Romain Bignon
855466df40 playlist_edit: improved range checks in shufflePlaylist() 2009-02-13 11:12:31 +01:00
Romain Bignon
9fe459f625 added the shufflerange command
This command shuffles a range of songs.
2009-02-13 10:43:30 +01:00
Max Kellermann
df9245c2aa update: free deleted subdirectories
Use delete_directory() for removing sub directories instead of
dirvec_clear().  This ensures that all memory occupied by
subdirectories of deleted directories is freed.
2009-02-12 19:12:32 +01:00
Max Kellermann
16bab6019b update: recursively purge deleted directories
When a directory is deleted, MPD deleted only the directory from the
database; it did not bother to walk the full tree to free all memory
and to remove deleted songs from the playlist.  Replace a
dirvec_delete() with delete_directory().
2009-02-12 19:12:25 +01:00
Max Kellermann
a06e281421 aac: fix stream metadata
Pass the input_stream object to decoder_data().  Without it, the MPD
core does not see stream tags.
2009-02-12 18:39:19 +01:00
Max Kellermann
d55f6b5304 database: don't load database after charset was reconfigured
When you change the filesystem charset, discard the old database file
and create a new one.  The old database file will most likely contain
stale or invalid information.
2009-02-12 18:31:00 +01:00
Max Kellermann
a2ce6e5b82 wildmidi: added seeking support
Use WildMidi_SampledSeek() for seeking in a MIDI file.
2009-02-12 18:19:13 +01:00
Max Kellermann
321eb1077a wildmidi: provide and current total song time
The _WM_Info struct provides all we need, it is obtained by
WildMidi_GetInfo().
2009-02-12 16:47:48 +01:00
Max Kellermann
1492339463 wildmidi: new decoder plugin for MIDI files 2009-02-12 16:43:18 +01:00
Max Kellermann
e56a90f3b3 fluidsynth: new decoder plugin for MIDI files
There are a few problems left in this plugin:

- fluidsynth decodes in real time, while MPD prefers to buffer as
  quickly as possible; as a workaround, this plugin uses a timer
  object to synchronize with real-time playback

- I don't know yet how fluidsynth tells me when the song has ended

- the "soundfont" configuration setting is not yet documented, and it
  will likely change soon (in favor of a per-decoder configuration
  block)
2009-02-12 08:43:26 +01:00
Max Kellermann
1136f6fb7a sidplay: new decoder plugin for playing C64 SID files 2009-02-11 20:31:17 +01:00
Max Kellermann
b6b181ca87 decoder_thread: re-enable file decoders
By accident, I committed a debug flag, which disallowed the decoder
thread to play files locally.  Undo this hunk.
2009-02-11 19:58:50 +01:00
Max Kellermann
550b9c3f23 ffmpeg: added TTA support
The ffmpeg library supports the "True Audio Codec".  The entry in
ffmpeg_suffixes was missing.
2009-02-11 18:27:11 +01:00
Max Kellermann
58a5d30826 playlist: don't preserve "current" song after "random" toggle
When MPD is not playing, it may still remember which is the "current"
song.  When you switch to "random" mode, MPD will always start playing
exactly this song.  This defies the goal of "random" mode a little.
Clear the "current" song when MPD is not playing during the "random"
mode switch.
2009-02-11 18:02:50 +01:00
Max Kellermann
9d447dda1d audio: moved code to output_command.c
The output_command library provides a command interface to the audio
outputs.  It assumes the input comes from an untrusted source
(i.e. the client) and verifies all parameters.
2009-02-11 18:02:45 +01:00
Max Kellermann
3bc4224bfd audio_format: added validation functions
In addition to audio_format_valid(), provide functions which validate
only one attribute of an audio_format.  These functions are reused by
audio_format_parse().
2009-02-11 18:00:48 +01:00
Max Kellermann
5090cf6484 audio: replaced parseAudioConfig() with audio_format_parse()
Added audio_format_parse() in a separate library, with a modern
interface: return a GError instead of logging errors.  This allows the
caller to deal with the error.
2009-02-11 18:00:41 +01:00
Qball Cow
5484aaee5f Set boundPort to the current portnumber, so zeroconf announces the right port number 2009-02-11 14:45:04 +01:00
Max Kellermann
b21e8ad4a5 output_all: immediately reopen output on play
When MPD explicitly starts playing, ignore the "REOPEN_AFTER" timeout.
This timeout was useful when MPD attempted to reopen a failed device
over and over, but it confuses users when they explicitly tell MPD to
start playing, while MPD insists to wait for the 10 seconds to pass.
2009-02-10 22:15:42 +01:00
Max Kellermann
e8aee4d992 output_thread: moved code to ao_close()
Merge some duplicate code into one function.
2009-02-10 22:09:07 +01:00
Max Kellermann
a96993f655 output_thread: leave the pause loop on failure
When the pause() method fails, leave the pause loop, because calling
pause() on a closed device is not allowed.
2009-02-10 22:08:05 +01:00
Max Kellermann
bd8ecba449 output_thread: consistently (de)initialize pcm_convert_state
Fix a memory leak: it was not guaranteed that pcm_convert_deinit() was
called for each pcm_convert_init().  This patch always (de)initializes
the pcm_convert library when the audio_output.open flag is flipped.
2009-02-10 22:07:59 +01:00
Max Kellermann
61e3075981 output_api: no CamelCase in struct audio_output
Renamed audio_output struct members.
2009-02-10 21:50:51 +01:00
Max Kellermann
744702f266 shout_mp3: use audio_format_frame_size()
Use audio_format_frame_size() instead of
channels*audio_format_sample_size().
2009-02-10 21:30:28 +01:00
Max Kellermann
b27d9e055b shout: pass void pointer to the encoder
Pass the music chunk as a "const void *" to the encoder, instead of a
"const char *".  Actually, both encoders currently expect 16 bit
samples, passing a 8-bit character is rather pointless.
2009-02-10 21:28:25 +01:00
Max Kellermann
12756c1b55 shout_ogg: moved PCM conversion to a separate function
For simplification, moved the PCM conversion code to
pcm16_to_ogg_buffer().  Work with a int16_t pointer instead of a char
pointer.
2009-02-10 21:25:45 +01:00
Max Kellermann
54982f755f ao: declare AoData.writeSize as size_t
writeSize is a memory size and its type should thus be size_t.  This
allows us to remove two explicit casts.
2009-02-10 21:24:35 +01:00
Max Kellermann
fe142647a5 osx: removed disabled debug messages
Nobody needs these debug messages anymore.
2009-02-10 20:57:21 +01:00
Max Kellermann
86d4cf0dbd output_all: added API documentation 2009-02-10 18:51:59 +01:00
Max Kellermann
facf146cfd output_all: moved code to audio_output_all_finished()
audio_output_all_finished() returns bool, not int.
2009-02-10 18:51:53 +01:00
Max Kellermann
4493a96425 output_all: no CamelCase
Renamed functions and variables.
2009-02-10 18:51:51 +01:00
Max Kellermann
a3a6eefcfe audio: moved code to output_all.c
Moved code which deals with all audio outputs at once into a separate
library.
2009-02-10 18:51:49 +01:00
Max Kellermann
e7505381eb audio: moved protocol code to output_print.c 2009-02-10 18:51:42 +01:00
Max Kellermann
49ff2aceb5 audio: moved state file code to output_state.c 2009-02-10 18:51:39 +01:00
Max Kellermann
f141d90533 audio: removed isCurrentAudioFormat()
This function isn't used anymore.
2009-02-10 18:51:38 +01:00
Max Kellermann
2a388c2aa7 crossfade: don't use isCurrentAudioFormat()
The crossfading code shouldn't depend on the audio output code.  Pass
the current audio format to cross_fade_calc() and let it compare
directly, instead of using isCurrentAudioFormat().
2009-02-10 18:51:29 +01:00
Max Kellermann
34244398d0 playlist: fix assertion when last/current song is deleted
When MPD is stopped, but the last song is still the "current song",
and you delete it, playlist->current is not updated, and becomes an
invalid value.  Fix this by catching "!playlist->playing &&
playlist->current == (int)songOrder".
2009-02-10 17:55:08 +01:00
Max Kellermann
e8787ac4a4 audio: added output enumeration functions
Added audio_output_get(), audio_output_find().
2009-02-10 17:21:19 +01:00
Max Kellermann
3e87033145 audio: added audio_output_config_count()
audio_output_config_count() returns the number of audio outputs in the
configuration file.  It is only used by initAudioDriver().  The public
function audio_output_count() now returns audioOutputArraySize.
2009-02-10 17:21:10 +01:00
Max Kellermann
ff09a41807 output_internal: added missing output_api.h include
output_api.h is required for enum audio_output_command.
2009-02-10 17:21:08 +01:00
Max Kellermann
c2bbf876fb player: added some more assertions
Assertions on pc.command and pc.next_song.
2009-02-10 08:18:28 +01:00
Max Kellermann
799d1c9dc2 player_thread: reset pc.next_song only if queued
When we reset pc.next_song if there is no song queued, this might
cause a race condition: the next song to be played is cleared, while
pc.command was already set.  Clear the "next_song" only if there is a
song queued for the current do_play() invocation.
2009-02-10 08:18:01 +01:00
Max Kellermann
40393ae64f playlist: update queued song after seeking
If a new song is queued before calling playerSeek(), then the player
and the playlist enter an inconsistent state, because the player
discards the playlist's "queued" song in favor of the seeked song.

Call playlist_update_queued_song() after playerSeek().
2009-02-10 00:17:46 +01:00
Max Kellermann
2274434e53 player_thread: reset pc.next_song
After a player command (successful or not), reset pc.next_song,
because the queue is supposed to be empty then.  Otherwise,
playlist.queued and pc.next_song may disagree, which triggers an
assertion failure.
2009-02-10 00:17:34 +01:00
Max Kellermann
710b3275ea queue: update order array after song move
Commit f78cddb4 introduced a regression: after a song was moved, the
order array was not updated (in random mode).  This caused MPD to
think the "current" song has changed when you moved something to the
position of the current song.
2009-02-09 22:47:23 +01:00
Vladimir S Eremin
d9ce8d8342 playlist: fixed "next song" check
Check if the "current+1" position is actually valid.
2009-02-09 21:14:38 +01:00
Max Kellermann
e2f22229a6 output_api: include "config.h" without "../"
Including "../config.h" breaks on some systems.
2009-02-09 16:50:25 +01:00
Max Kellermann
1ac328b553 shout: clear buffer before calling the encoder
Always assume the buffer is empty before calling the encoder.  Always
flush the buffer immediately after there has been added something.
This reduces the risk of buffer overruns, because there will never be
a "rest" in the current buffer.
2009-02-09 16:38:25 +01:00
Max Kellermann
7fc25ad567 shout: don't postpone metadata
Don't duplicate the tag received by the send_metadata() method - send
it to the shout server directly.
2009-02-09 16:38:22 +01:00
Max Kellermann
f5c43889c3 shout: use libshout's synchronization
Removed the manual timer synchronization from the shout plugin.
libshout's shout_sync() function does it for us.
2009-02-09 16:38:20 +01:00
Max Kellermann
f6455d5f79 shout: switch to blocking mode
The non-blocking mode of libshout is sparsely documented, and MPD's
implementation had several bugs.  Also removed connect throttling
code, that is done by the MPD core since 0.14.
2009-02-09 16:38:03 +01:00
Max Kellermann
cf94008b27 shout: removed shout_data.tag_to_send
When shout_data.tag!=NULL, there is a "tag to send".  The tag_to_send
flag is redundant.
2009-02-09 16:37:16 +01:00
Max Kellermann
044f2561ce shout: removed shout_data.shout_error
That variable is set in handle_shout_error(), but is never read.
2009-02-09 16:37:12 +01:00
Vladimir S Eremin
cde4cb944e playlist: provide information about "next song"
In random mode, this patch allows clients to see the "next song" in
the queue.
2009-02-09 10:38:03 +01:00
Max Kellermann
b358962960 playlist: increase playlist version after loading state
After the state file has been loaded, the playlist version is still
"1", and "plchanges 1" returns the whole playlist.  Fix this by
increasing the playlist version after the state file has been loaded.
2009-02-04 23:50:04 +01:00
Max Kellermann
5d0c83ba5e update: check whether stickers are enabled
If stickers are not configured at runtime, don't call
sticker_song_delete().
2009-02-04 22:33:43 +01:00
Max Kellermann
94685aa9bd playlist_save: added spl_save_playlist()
spl_save_playlist() is a wrapper for spl_save_queue().
2009-02-04 22:15:37 +01:00
Max Kellermann
19397a84cc playlist: added G_LOG_DOMAIN
Removed the explicit "playlist:" prefix from all log messages.
2009-02-04 22:15:31 +01:00
Max Kellermann
2a1bef2225 playlist_print: added wrappers for printing the queue
Hide the details of the playlist behind wrapper functions.
2009-02-04 22:09:04 +01:00
Max Kellermann
cbea8a2a00 playlist: pass const playlist pointers
Pass constant playlist objects to functions which do not modify it.
2009-02-04 22:08:39 +01:00
Max Kellermann
080dd095a5 playlist_print: added API documentation 2009-02-04 21:09:37 +01:00
Max Kellermann
60bec77664 playlist_print: use bool instead of int
Return true on success, instead of 0.  Converted the "detail"
parameter to bool.
2009-02-04 21:04:30 +01:00
Max Kellermann
f817285922 playlist_print: no CamelCase
Renamed one function.
2009-02-04 21:02:11 +01:00
Max Kellermann
cfaede610c playlist_print: include cleanup 2009-02-04 21:02:09 +01:00
Max Kellermann
15f914a74a playlist: moved code to playlist_edit.c
Moved functions for playlist editing (append, delete, shuffle, move)
to playlist_edit.c.
2009-02-04 20:31:53 +01:00
Max Kellermann
f3d6d536f6 playlist: moved code to playlist_control.c
Moved handlers for control commands (play, stop, next, prev) to
playlist_control.c.
2009-02-04 20:31:22 +01:00
Max Kellermann
4db51eeccd playlist: call syncPlaylistWithQueue() only in the event handler
Don't call syncPlaylistWithQueue() in nextSongInPlaylist() and
previousSongInPlaylist().  This is a relic from the time when there
was no event, and was a workaround to the timing problem.
2009-02-04 19:44:32 +01:00
Max Kellermann
8d3205871c playlist: renamed global "playlist" variable to "g_playlist"
Export the "g_playlist" variable, and pass it to all playlist
functions.  This way, we can split playlist.c easier into separate
parts.  The code which initializes the singleton variable is moved to
playlist_global.c.
2009-02-04 18:56:41 +01:00
Max Kellermann
1720c7090d playlist: moved code to playlist_state.c
Moved everything related to saving or loading the playlist from/to the
state file to playlist_state.c.
2009-02-04 18:52:39 +01:00
Max Kellermann
e27a665b89 playlist: simplified playlist.queued updates
Before every operation which modifies the playlist, remember a pointer
to the song struct.  After the modification, determine the "next song"
again, and if it differs, dequeue and queue the new song.

This removes a lot of complexity from the playlist update code, and
makes it more robust.
2009-02-04 18:52:37 +01:00
Max Kellermann
824d299eb1 ffmpeg: fixed seek integer overflow
The "current" variable is used for calculating the seek destination,
and was declared as "int".  With very long song files, the 32 bit
integer can overflow.  ffmpeg expects an int64_t, which is very
unlikely to overflow.  Switch to int64_t.
2009-02-03 22:51:44 +01:00
Max Kellermann
f3b73b824f ffmpeg: check if the time stamp is valid
When ffmpeg cannot estimate the elapsed time, it sets
AVPacket.pts=AV_NOPTS_VALUE.  Our ffmpeg decoder plugin did not check
for that special value.
2009-02-03 22:51:41 +01:00
Max Kellermann
81b6c0d77b ffmpeg: don't warn of empty packet output
If avcodec_decode_audio2() returns no output for an AVPacket,
libavcodec may buffer some data, and return a larger chunk of output
later.  This patch disables a lot of bogus warnings.
2009-02-03 22:51:38 +01:00
Max Kellermann
a7632b09e0 ffmpeg: print codec name
Output the name of the codec as a debug message.  During my tests,
ffmpeg never filled this struct member, but it may do so in the past,
and this debug message might become helpful.
2009-02-03 22:51:35 +01:00
Max Kellermann
3b0a78fe0d shout_mp3: call lame_close() in clear_encoder() method
The shout_mp3 encoder had two bugs: when no song was ever played, MPD
segfaulted during cleanup.  Second bug: memory leak, each time the
shout device was opened, lame_init() was called again, and
lame_close() is only called once during shutdown.

Fix this by shutting down LAME each time the clear_encoder() method is
called.
2009-02-02 18:22:56 +01:00
Max Kellermann
1fdf25214f shout_mp3: free the lame_data struct on exit
Make valgrind a little bit happier: free the global lame_data struct
in the finish() method.
2009-02-02 18:22:53 +01:00
Max Kellermann
4b7c28f98e player_thread: set player error when output device fails
When the output device fails to play a chunk, set pc.error to
PLAYER_ERROR_AUDIO.  This way, the playlist knows that it should not
queue the next song.
2009-02-02 18:22:41 +01:00
Max Kellermann
fdb80e74b7 main: don't pass argv[0] to openDB()
Don't mention the program name in the error message.
2009-02-02 16:58:51 +01:00
Max Kellermann
37bcd711b5 main: create database after daemonization
When the update thread is started before MPD has forked (for
daemonization), it is killed, because threads do not survive a fork().
This induces an inconsistent state where MPD won't start any update
thread at all, because it thinks the thread is already running.
2009-02-02 16:57:24 +01:00
Max Kellermann
231636b9eb output_api: moved the command check out of method pause()
Move the "while" loop which checks for commands to the caller
ao_pause().  This simplifies the pause() method, and lets us remove
audio_output_is_pending().
2009-01-30 20:12:38 +01:00
Max Kellermann
6aa734dc35 playlist: clear playlist.playing when deleting current song
This fixes an assertion failure: when the last song in the playlist
was playing, and you deleted it, MPD aborted.
2009-01-30 19:54:19 +01:00
Max Kellermann
dd23e71953 output_api: removed DISABLED_AUDIO_OUTPUT_PLUGIN
The macro is unused.
2009-01-30 19:48:09 +01:00
Max Kellermann
a2e0b71aad output_api: removed audio_output_closed()
The function is only used by the MVP output plugin, and this one call
is wrong.
2009-01-30 19:47:59 +01:00
Max Kellermann
eeec32feaa jack: don't override output_ports in connect()
If no ports are configured, don't overwrite the (NULL) configuration
with the port names of the first JACK server.  If the server changes
after a JACK reconnect, MPD won't attempt to auto-detect again.
2009-01-30 19:44:58 +01:00
Max Kellermann
a93e73bea8 jack: removed sample_rate callback
Currently, the JACK plugin manipulates the audio_format struct which
was passed to the open() method.  This is very likely to break,
because the plugin must not permanently store this pointer.  After
this patch, MPD ignores sample rate changes.  It looks like other
software is doing the same, and I guess this is a non-issue.

This patch converts the audio_format pointer within jack_data into a
static audio_format struct.
2009-01-30 19:43:31 +01:00
Max Kellermann
5900827675 configure.ac: detect jack_set_info_function()
jack_set_info_function() is not provided by older libjack versions.
Attempt to detect if it is available.
2009-01-30 19:43:25 +01:00
Matthias Drochner
5b85288664 mikmod: call MikMod_Exit() only in the finish() method
Hi -
independently of libmikmod's other problems - there seems
to be a problem in mpd's wrapper: MikMod_Exit() is called
after the first file is decoded, which frees some ressources
within the mikmod library. An attempt to play a second file
leads to a crash. The appended patch fixes this for me.
(I don't know what the "dup" entry is good for - someone
who knows should review that too.)
best regards
Matthias

[mk: removed 3 more MikMod_Exit() invocations]
2009-01-30 17:51:16 +01:00
Max Kellermann
02bfb0c4e4 wavpack: pass NULL if the .wvc file fails to open
The wavpack library seems to use the .wvc stream even if the OPEN_WVC
flag is not set.  In this case, pass NULL to be sure libwavpack won't
use it.
2009-01-30 16:05:02 +01:00
Max Kellermann
0d3dff9512 jack: print info messages
Use jack_set_info_function() to install an info callback.  Don't let
libjack print them to stderr.
2009-01-30 15:57:43 +01:00
Max Kellermann
76b217f71e client: check for G_IO_ERR and G_IO_HUP
When we do not explicitly catch G_IO_ERR and G_IO_HUP, GLib can go
into an infinite loop, because it won't deliver the socket error to
MPD.
2009-01-30 15:56:53 +01:00
Max Kellermann
c38dd9e8d8 mapper: ignore duplicate slashes in playlists
When there are duplicate slashes in the song paths, eliminate them;
example:

 /var/lib/mpd/music//foo.mp3

becomes:

 /var/lib/mpd/music/foo.mp3

The slash is only detected at the border between the music_directory
and the local part.
2009-01-30 13:51:18 +01:00
Max Kellermann
e3d4fa6946 mapper: remove trailing slashes from music_directory
When the user configures a music_directory with a trailing slash, it
may break playlist loading, because MPD expects a double slash.  Chop
off the trailing slash.
2009-01-30 13:50:24 +01:00
David Horn
efb04532df ffmeg: added support for the tags comment, genre, year
ffmpeg_tag_internal() does not look for a few tags that mpd
supports. Most noteably:

 comment -> TAG_ITEM_COMMENT -> Description
 genre -> TAG_ITEM_GENRE -> WM/Genre (not WM/GenreID)
 year -> TAG_ITEM_DATE -> WM/Year

I *think* that this is the last of the tags that AVFormatContext() in
ffmpeg supports that mpd also uses.
2009-01-30 09:42:49 +01:00
Max Kellermann
32d6d4499e input_stream: make seek(), buffer() optional
Make those two methods optional to implement, and let input_stream.c
provide fallbacks.  The buffer() method will be removed one day, and
there is now only one implementation left (input_curl.c).
2009-01-30 00:58:03 +01:00
Max Kellermann
82cfce76eb archive: replaced setup_stream() with open_stream()
The open_stream() method opens the input_stream.  This allows the
archive plugin to do its own initialization, and it also allows it to
use input_stream.data.  We can remove input_stream.archive now, which
was unnatural to have in the first place.
2009-01-30 00:53:32 +01:00
Max Kellermann
dc1cc7e7e5 input_stream: let the implementation assign is->plugin
This way, plugins can manipulate the plugin pointer during open().
2009-01-30 00:40:14 +01:00
Max Kellermann
297101c3f8 input_stream: documented the API 2009-01-30 00:07:53 +01:00
Max Kellermann
27c5b90dc3 jack: don't manually close on shutdown
Return false from mpd_jack_play(), let the MPD core close the device.
2009-01-29 23:16:34 +01:00
Max Kellermann
846f126259 jack: initialize output_ports if not configured
Don't leave uninitialized bytes in the jack_data struct.
2009-01-29 23:16:30 +01:00
Max Kellermann
e959c8e084 jack: close JACK client on stop
When MPD stops playback, close the JACK client connection.
2009-01-29 23:16:21 +01:00
Max Kellermann
e68924435a jack: removed "bps" attribute
The "bps" attribute is calculated, but never used.
2009-01-29 23:15:55 +01:00
Max Kellermann
5a2949552b jack: make mpd_jack_connect() return bool
Return true/false instead of 1/-1.
2009-01-29 23:15:27 +01:00
Max Kellermann
eccc7c21bd jack: use loops for allocating/freeing ports/buffers
Preparation for supporting other channel numbers than stereo: use
loops instead of duplicating code for the second channel.  Most
likely, gcc will unroll these loops, so the binary won't be any
different.
2009-01-29 23:14:04 +01:00
Max Kellermann
3baeddbcae jack: fail if jack_get_ports() returns NULL
When jack_get_ports() returns NULL, we cannot have any ports to
connect to, and the device cannot play anything.
2009-01-29 23:12:16 +01:00
Max Kellermann
5bcf415ad0 jack: use jack_port_name() instead of g_malloc()+sprintf()
libjack's jack_port_name() function returns the effective port name,
we don't need to do it manually.
2009-01-29 23:12:10 +01:00
Max Kellermann
67cf2ee6e4 jack: initialize libjack's error function in mpd_jack_init()
Do the global libjack initialization in the global plugin
initialization function.
2009-01-29 23:12:08 +01:00
Max Kellermann
3a75f15844 mms: declare GLib log domain 2009-01-29 21:43:45 +01:00
Max Kellermann
caa4d28f04 added support for the MMS protocol
This patch implements the MMS protocol, by using libmms.  It is quite
experimental: it does not support seeking yet, and it is currently
using synchronous I/O, which causes MPD to hang while waiting for the
server.
2009-01-29 21:42:10 +01:00
Max Kellermann
36ca114629 player_control: reset pc.error if pc.errored_song is cleared
When the playlist is cleared, pc.errored_song is also cleared.  This
causes pc_errored_song_uri() to crash, because it assumes that
pc.errored_song is set.  Reset pc.error to fix that assumption.
2009-01-29 21:39:29 +01:00
Max Kellermann
a73266962f jack: reduced sleep time to 1ms
When waiting for free space in the ring buffer, the JACK plugin
sleeped 10ms until there is enough space.  This delay was too large
for low-latency setups (<10ms), and created a lot of xruns.  Work
around that by reducing the sleep time to 1ms.

A proper solution for this would be to use an event based approach,
and we will do it, just not now.
2009-01-29 18:13:09 +01:00
Max Kellermann
1e0ceb3d88 jack: clear "shutdown" flag on reconnect
When the connection failed once, you had to restart MPD, because it
never cleared the jack_data.shutdown flag.  Instead, it refused to
play anything "because there is no client thread" (which is wrong at
that point).
2009-01-29 18:13:03 +01:00
Max Kellermann
3a070d3d23 jack: allocate ring buffers before connecting
If the ring buffers are allocated after jack_activate(),
mpd_jack_process() might segfault because it attempts to access them.
2009-01-29 18:12:52 +01:00
Max Kellermann
bbf0453709 jack: register ports before activating clients
Call jack_port_register() before jack_activate().
2009-01-29 18:12:25 +01:00
Max Kellermann
24d6ae8bea zeroconf: corrected default service name usage
The variable "serviceName" is initialized with SERVICE_NAME, but was
overwritten with NULL when the setting is not configured.
2009-01-27 20:17:44 +01:00
Max Kellermann
8bc6bca555 client: use the GIOChannel for I/O
GIOChannel is more portable than raw read()/write() calls.  We're
using GIOChannel anyway, because we need it for plugging the client
into the GLib main loop.

Configure the GIOChannel to the bare minimum: no character set, no
buffering.
2009-01-25 19:54:57 +01:00
Max Kellermann
b0ea975642 client: use GLib's win32 IO channel on WIN32
Use g_io_channel_win32_new_socket() instead of g_io_channel_unix_new()
on WIN32.
2009-01-25 19:40:10 +01:00
Laszlo Ashin
808a369ca8 tag: remove unused variable param
This variable doesn't have a role since 80799fa8.
2009-01-25 19:38:49 +01:00
Max Kellermann
c4bb227bdb database: eliminate "goto" usage
http://xkcd.com/292/
2009-01-25 18:47:23 +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
936449c622 mixer_api: removed struct mixer_data
The mixer plugins should re-use the mixer struct and incorporate it in
their object class.
2009-01-25 17:45:16 +01:00
Max Kellermann
dc575106c2 mixer: merged methods "init" and "configure"
Both methods are always called together.  There is no point in having
them separate.  This simplifies the code, because the old configure()
method could be called more than once, and had to free old
allocations.
2009-01-25 17:38:12 +01:00
Max Kellermann
db2058a265 mixer: removed mixer_configure_legacy(), AC_MIXER_CONFIGURE
Those have been superseded by the new legacy configuration code.
2009-01-25 17:38:06 +01:00
Max Kellermann
188f9e663c mixer: configure legacy mixer before the audio outputs
Reimplemented the legacy mixer configuration: copy the deprecated
configuration values into the audio_output section.  Don't configure
the mixers twice (once for the audio_output, and a second time for the
legacy values).

This requires volume_init() to be called before initAudioDriver().
2009-01-25 17:38:02 +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
ad8561bfdc mixer: make all mixer_plugin pointers const
The plugin structures must never be modified.
2009-01-25 17:37:52 +01:00
Max Kellermann
899eb5383d mixer: added missing copyright headers 2009-01-25 17:37:50 +01:00
Max Kellermann
cb1f2e0c01 conf: added config_add_param()
The function config_add_param() allows adding new configuration
parameters.
2009-01-25 17:37:45 +01:00
Qball Cow
b6c3adcaaa Add idle event on sticker deletion, update and insertion 2009-01-25 16:37:29 +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
80799fa84e use config_get_string() instead of config_get_param()
config_get_string() is easier to use than config_get_param() because
it unpacks the config_param struct.
2009-01-25 16:00:51 +01:00
Max Kellermann
bdfb6c239a playlist: moved is_valid_playlist_name() to stored_playlist.c 2009-01-25 14:19:28 +01:00
Max Kellermann
98cb8f3969 playlist: moved savePlaylist() and loadPlaylsit() to playlist_save.c 2009-01-25 14:11:47 +01:00
Max Kellermann
69c74afa25 playlist: removed g_rand, PLAYLIST_HASH_MULT
Both are unused.
2009-01-25 14:01:27 +01:00
Max Kellermann
688880bc0b queue: added queue_shuffle_order_last()
This function shuffles the last song of a range.  This is used by
addSongToPlaylist().
2009-01-25 14:00:51 +01:00
Max Kellermann
1a59afa388 stored_playlist: moved configuration variables from playlist.c
Don't declare and export variables specific to stored playlists in
playlist.c/playlist.h.
2009-01-25 13:53:16 +01:00
Max Kellermann
85f7e964de player_thread: start decoder thread in player thread
Start the decoder thread when the player thread starts.  The decoder
thread is already stopped by the player thread.
2009-01-25 13:44:39 +01:00
Max Kellermann
d628eb3e8b player_control: added player_control.thread
player_control.thread contains the handle of the player thread, or
NULL if the player thread isn't running.
2009-01-25 13:44:33 +01:00
Max Kellermann
ac0e799965 decoder_control: added decoder_control.thread
decoder_control.thread contains the handle of the decoder thread, or
NULL if the decoder thread isn't running.
2009-01-25 13:44:27 +01:00
Max Kellermann
2c45224be7 mapper: added dot to PLAYLIST_FILE_SUFFIX
Some code will be a little bit simpler if the dot is part of the
string literal.
2009-01-25 13:43:57 +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
Qball Cow
16796b1209 Fix tag not being set when casefolding the locate_item_list 2009-01-25 12:20:47 +01:00
Max Kellermann
2bfe6f6412 renamed the "mod" decoder plugin to "mikmod"
We have two mod plugins now: modplug and mod.  Rename the latter to a
more useful name.
2009-01-24 20:18:44 +01:00
Max Kellermann
5795be1f8d tag_id3: added MusicBrainz tag support
Added support for the MusicBrainz TXXX tags, documented on:

  http://musicbrainz.org/doc/MusicBrainzTag
2009-01-24 20:07:23 +01:00
Max Kellermann
b4d90cc28c tag_id3: always allocate tag object
Save some code: always allocate the tag object, and free it when it
turns out to be empty.
2009-01-24 20:02:59 +01:00
Max Kellermann
30e2880675 tag: added support for MusicBrainz tags
Added all important id tags from the MusicBrainz wiki:

 http://musicbrainz.org/doc/MusicBrainzTag

This should automatically enable its suport in the vorbis and flac
decoder plugins.
2009-01-24 20:02:55 +01:00
Max Kellermann
0dc1b4a44e modplug: removed EOF check from the while loop
EOF is checked by input_stream_read() (decoder_read() here).  Don't do
it twice.  The check was wrong anyway, it was reversed.
2009-01-24 20:02:06 +01:00
Max Kellermann
793934cf9c modplug: check for input_stream errors
When input_stream_read() returns 0, and input_stream_eof() returns
false, an I/O error has occured.  Skip this song.
2009-01-24 19:16:33 +01:00
Max Kellermann
14b37656a6 modplug: use size_t instead of int for buffer sizes 2009-01-24 19:16:31 +01:00
Max Kellermann
4a4c6fb6dc modplug: check size limit before appending new buffer
Don't enlarge the GByteArray when the size limit may overflow in this
operation; check the size limit first.
2009-01-24 19:16:20 +01:00
Max Kellermann
b53e80d785 modplug: use GByteArray.len, remove total_len
The local variable "total_len" is superfluous because GByteArray
always knows its size.
2009-01-24 19:16:10 +01:00
Max Kellermann
0c71640528 modplug: unknown size is -1; check for empty file
The input_stream API sets size to -1 when the size of the resource is
not known.  The modplug decoder checked for size==0, which would be an
empty file.
2009-01-24 19:16:07 +01:00
Max Kellermann
961d172200 modplug: header cleanup
Don't include utils.h and log.h, they are relics from the past.
2009-01-24 19:16:05 +01:00
Max Kellermann
9229869f04 modplug: define G_LOG_DOMAIN
Make sure that log messages are decorated correctly.
2009-01-24 19:15:53 +01:00
Max Kellermann
b381638009 modplug: declare constants as enum
Don't write CPP if you can write C.
2009-01-24 19:15:50 +01:00
Max Kellermann
24d4c2df92 modplug: use only decoder_read(), not input_stream_read()
You are allowed to call decoder_read() with decoder==NULL.  It is a
convenience function provided by the decoder API.  Don't manually fall
back to input_stream_read().
2009-01-24 19:15:48 +01:00
Max Kellermann
e6cb939a82 locate: added locate_item_list_casefold()
Merged casefolding code from two locations into this one library
function.
2009-01-24 15:56:34 +01:00
Max Kellermann
6a2118d04c queue_print, dbUtils: use struct locate_item_list
Changed the function prototypes to get locate_item_list objects
instead of num_items/items.
2009-01-24 15:56:34 +01:00
Max Kellermann
ba7c996266 locate: added struct locate_item_list
Instead of passing two parameters around (number of items, array of
items), combine both in a variable size struct.
2009-01-24 15:56:30 +01:00
Max Kellermann
e100149124 locate: initialize the whole visited_types array
The declaration initialized only the first element.  Initialize the
whole array with memset() instead.
2009-01-24 15:27:09 +01:00
Max Kellermann
535cf5b5c9 locate: use bool instead of int
Use the C99 bool type instead of integer values (1/0 or 0/-1).
2009-01-24 15:27:05 +01:00
Max Kellermann
3582977e01 locate: no CamelCase
Renamed functions and variables.
2009-01-24 15:26:59 +01:00
Max Kellermann
daa5f5924d queue_print: use new_items instead of items
Fix a typo in one of the previous patches.
2009-01-24 15:26:23 +01:00
Max Kellermann
cf9595df18 playlist: removed locate functions to queue_print.c
Now playlist.c does not contain any protocol specific code anymore.
2009-01-24 14:55:28 +01:00
Max Kellermann
53e712aca4 locate: renamed LocateTagItem to "struct locate_item"
No CamelCase and no typedefs.
2009-01-24 14:52:05 +01:00
Max Kellermann
627d590ce5 command: use queue_print_*()
Replaced several wrapper functions from playlist.c, and make command.c
use the queue print functions directly.
2009-01-24 14:52:04 +01:00
Max Kellermann
d449d6abab playlist: added playlist_get_queue()
To allow code outside playlist.c to access the "queue" object,
provide a function which returns a const pointer.
2009-01-24 14:51:35 +01:00
Max Kellermann
6cfe032b94 playlist: renamed the Playlist typedef to "struct playlist"
No typedefs.
2009-01-24 13:34:53 +01:00