| Commit message (Collapse) | Author | Age | Files | Lines |
|
|
|
|
| |
Use g_free() consistently with g_malloc(). Don't clear the pointers
after freeing them.
|
|
|
|
|
|
|
|
|
| |
The player_thread loop requests the next song from the playlist as
soon as the decoder finishes the song which is currently being played.
This is superfluous, and can lead to synchronization errors and wrong
results. The playlist already knows when the player starts playing
the next song (player_wait_for_decoder() triggers the PLAYLIST event),
and will then trigger the scheduler to provide the next song.
|
|
|
|
|
| |
Simplify some code by using config_get_positive(), instead of doing
manual parsing and validation each time.
|
|
|
|
|
| |
This convenience function parses a configuration value into a positive
integer. It aborts if parsing fails.
|
| |
|
|
|
|
|
| |
player_wait_for_decoder() emits the PLAYLIST event on success, remove
the duplicate PLAYLIST event in its caller.
|
|
|
|
|
|
| |
The "TAG" event is emitted by the player thread when the current
song's tag has changed. Split this event from "PLAYLIST" and make it
a separate callback, which is more efficient.
|
| |
|
|
|
|
|
|
|
| |
The "sticker" command allows clients to query or manipulate the
sticker database. This patch implements the sub-commands "get" and
"set"; more will follow soon (enumeration), as well as extended
"lsinfo" / "playlistinfo" versions.
|
|
|
|
|
|
|
| |
When a song is deleted from the database, remove its sticker, too.
What's still missing is some sort of garbage collector after a fresh
database create (--create-db).
|
|
|
|
|
| |
This is a wrapper for the backend sticker library. It provides
several glue functions which take a song object instead of type/uri.
|
|
|
|
|
|
|
| |
"Stickers" are pieces of information attached to existing MPD objects
(e.g. song files, directories, albums). Clients can create arbitrary
name/value pairs. MPD itself does not assume any special meaning in
them.
|
|
|
|
|
| |
The plugin queries build-time configuration variables, and should
include config.h.
|
|
|
|
| |
Minimize header dependencies.
|
|
|
|
| |
Eliminate some more getBlockParam() invocations.
|
|
|
|
| |
This replaces lots of getBlockParam() invocations.
|
|
|
|
| |
Don't modify the configured string.
|
|
|
|
|
| |
Determine the audio output name with audio_output_get_name() instead
of obtaining the name from the configuration again.
|
|
|
|
| |
Use config_get_path() instead in mapper.c.
|
|
|
|
|
| |
The g_free() function includes a NULL check. We don't have to do it
twice.
|
|
|
|
| |
This causes a segmentation fault...
|
|
|
|
|
| |
This way, we don't have to pass the full "Options" object to
daemonize().
|
|
|
|
|
|
| |
The constructor/destructor functions parse and free the configuration
properly. This way, we don't have to load the pid file path more than
once.
|
|
|
|
| |
The state_file library should manage its own regular saves.
|
|
|
|
|
| |
The constructor/destructor interface should hide the functions
read_state_file() and write_state_file().
|
| |
|
|
|
|
| |
config_get_path() is an simpler interface than parseConfigFilePath().
|
|
|
|
|
| |
Fetch the configuration variables buffered_chunks and
buffered_before_play just when they are needed.
|
|
|
|
|
| |
Moved changeToUser(), cleanUpPidFile(), killFromPidFile() to
daemon.c. These are daemonization functions.
|
|
|
|
| |
Without a music_directory, MPD is an excellent streaming client.
|
| |
|
|
|
|
| |
Don't include conf.h in database.c.
|
|
|
|
|
| |
time(NULL) shows the wrong results when the machine's clock is
changed.
|
|
|
|
|
| |
Don't use dbUtils.h functions. This reduces 4 full database walks to
just one.
|
|
|
|
|
| |
Don't recalculate the number of artists and albums each time a client
requests statistics. Calculate that once in stats_update().
|
|
|
|
| |
Renamed functions and types.
|
|
|
|
| |
Don't return a writable pointer.
|
|
|
|
| |
No "force" parameter, pass a default value instead.
|
| |
|
|
|
|
| |
Renamed functions, types, variables.
|
|
|
|
|
|
| |
If a song is not within the music directory ("file:///..."), it has no
"parent directory". The archive code nonetheless dereferences the
parent pointer, causing a segmentation fault. Check parent!=NULL.
|
|
|
|
|
|
|
| |
One of the previous patches made MPD consume 100% CPU in a busy wait:
when the music_pipe was full, it did not wait (with notify_wait()) for
free chunks, because a variable has a different meaning now. Always
pass "true" as the "wait" parameter.
|
|
|
|
|
|
| |
Some plugins used the APE or ID3 tag loader as a fallback when their
own methods of loading tags did not work. Move this code out of all
decoder plugins, into song_file_update().
|
| |
|
|
|
|
|
|
| |
Removed yet another superfluous buffer layer: return the PCM buffer
from pcm_convert() instead of copying PCM data into the
caller-supplied buffer.
|
|
|
|
|
| |
The function is unused, since decoder_api() uses music_pipe_write() /
music_pipe_expand() now.
|
|
|
|
|
| |
Copy PCM data to the music_pipe_write() buffer, and apply replay gain
/ normalization to it, instead of manipulating the source buffer.
|
|
|
|
|
|
|
| |
This new API gives the caller a writable buffer to the music pipe
chunk. This may allow the caller to eliminate several buffer copies,
because it may manipulate the returned buffer, until it calls
music_pipe_expand().
|
|
|
|
|
|
|
|
|
|
|
|
| |
When libvorbis knows that a song is seekable, it seeks around like
crazy in the file before starting to decode it. This is very
expensive on remote HTTP resources, and delays MPD for 10 or 20
seconds.
This patch disables seeking on remote songs, because the advantages of
quickly playing a song seem to weigh more than the theoretical ability
of seeking for most MPD users. If users feel this feature is needed,
we will make a configuration option for that.
|
|
|
|
| |
Decoder plugins must not send partial frames.
|