aboutsummaryrefslogtreecommitdiffstats
path: root/src/decoder_api.c (follow)
Commit message (Collapse)AuthorAgeFilesLines
* decoder, player: support song rangesMax Kellermann2009-12-271-2/+9
| | | | | | | Seek the decoder to the start of the range before beginning with playback. Stop the decoder when the end of the range has been reached. Add the start position to the seek position. Expose the duration of the range, not the full song file.
* decoder_api: added function decoder_timestamp()Max Kellermann2009-12-261-3/+19
| | | | | | Remove the data_time parameter from decoder_data(). This patch eliminates the timestamp counting in most decoder plugins, because the MPD core will do it automatically by default.
* output_init: use the normalize filter pluginMax Kellermann2009-12-251-4/+0
| | | | | | Use the plugin instead of the glue code in normalize.c. This is used wrapped inside a "autoconv" filter, to enable normalization for all input file formats.
* input_stream: return errors with GErrorMax Kellermann2009-12-151-1/+9
|
* fixed several gcc warnings on unused debug variablesMax Kellermann2009-12-141-1/+1
|
* decoder_api: prefer stream_tag over decoder_tagThomas Jansen2009-12-071-2/+2
| | | | | | If both tags (stream and decoder) are present, we prefer the stream tag. Fixes #2698, where ICY tag contained useful information, but was overwritten with bogus decoder tag data.
* audio_format: added function audio_format_to_string()Max Kellermann2009-11-141-8/+6
| | | | | Unified function for converting an audio_format object to a string, for log messages and for the "status" command.
* include config.h in all sourcesMax Kellermann2009-11-121-0/+1
| | | | | | After we've been hit by Large File Support problems several times in the past week (which only occur on 32 bit platforms, which I don't have), this is yet another attempt to fix the issue.
* decoder_control: merge next_song and current_songMax Kellermann2009-11-031-1/+1
| | | | These two variables are redundant, we need only one of them.
* decoder_api: check decoder==NULL in decoder_read()Max Kellermann2009-11-011-1/+2
| | | | It's legal to pass decoder=NULL to decoder_read(). Add a check.
* decoder_control: removed the global variable "dc"Max Kellermann2009-10-311-62/+80
| | | | | Allocate a decoder_control object where needed, and pass it around. This will allow more than one decoder thread one day.
* player_control: protect command, state, error with a mutexMax Kellermann2009-10-311-5/+5
| | | | | | Use GMutex/GCond instead of the notify library. Manually lock the player_control object before accessing the protected attributes. Use the GCond object to notify the player thread and the main thread.
* decoder_control: protect command, state with a mutexMax Kellermann2009-08-131-5/+14
| | | | | | Replace decoder_control.notify with decoder_control.mutex and decoder_control.cond. Lock the mutex on all accesses to decoder_control.command and decoder_control.state.
* pcm_convert: use GError for error handlingMax Kellermann2009-07-231-8/+10
| | | | | Don't abort the whole MPD process when the conversion fails. This has been a denial-of-service attack vector for years.
* Preamp for missing replay-gainDaniel Seuthe2009-06-251-2/+1
|
* decoder_api: removed dc.pipe assertion from decoder_read()Max Kellermann2009-04-261-1/+0
| | | | | | Database update was broken due to the dc.pipe!=NULL assertion. This assertion is only valid while MPD decodes a song, not during database update.
* decoder: added assertions on dc.pipeMax Kellermann2009-04-251-0/+11
| | | | | dc.pipe must be non-NULL while the decoder thread is running. Ensure that with a load of assertions.
* decoder_api: submit the song tag to the music pipeMax Kellermann2009-04-131-6/+12
| | | | | | When a new song starts playing, send its tag (song->tag) to the music pipe. This allows output plugins to render tags for all songs, not only those with embedded tags understood by the decoder plugin.
* all: Update copyright header.Avuton Olrich2009-03-131-7/+7
| | | | | | | | 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.
* pipe: added music_buffer, rewrite music_pipeMax Kellermann2009-03-061-16/+21
| | | | | | | | Turn the music_pipe into a simple music_chunk queue. The music_chunk allocation code is moved to music_buffer, and is now managed with a linked list instead of a ring buffer. Two separate music_pipe objects are used by the decoder for the "current" and the "next" song, which greatly simplifies the cross-fading code.
* music_pipe: added music_pipe_push()Max Kellermann2009-03-061-33/+45
| | | | | | | Added music_pipe_allocate(), music_pipe_push() and music_pipe_cancel(). Those functions allow the caller (decoder thread in this case) to do its own chunk management. The functions music_pipe_flush() and music_pipe_tag() can now be removed.
* decoder_api: log audio format in a debug messageMax Kellermann2009-03-011-0/+14
| | | | | To aid debugging, print the audio format of the decoder plugin in a debug message, and print information about PCM conversion.
* decoder_api: fixed shadow warning, rename "wait"Max Kellermann2009-02-191-2/+2
| | | | | The parameter name "wait" overlaps with the POSIX wait() function. Rename it.
* utils: use g_usleep() instead of my_usleep()Max Kellermann2009-02-191-2/+1
| | | | | | | 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.
* decoder_api: moved struct decoder_plugin to decoder_plugin.hMax Kellermann2009-02-151-0/+1
| | | | | | 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.
* decoder_api: always notify_wait() for free chunksMax Kellermann2009-01-171-2/+1
| | | | | | | 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.
* decoder_api: pass const pointer to decoder_data()Max Kellermann2009-01-171-1/+1
|
* pcm_convert: return PCM buffer from pcm_convert()Max Kellermann2009-01-171-20/+6
| | | | | | Removed yet another superfluous buffer layer: return the PCM buffer from pcm_convert() instead of copying PCM data into the caller-supplied buffer.
* decoder_api: use music_pipe_write() instead of music_pipe_append()Max Kellermann2009-01-171-14/+33
| | | | | Copy PCM data to the music_pipe_write() buffer, and apply replay gain / normalization to it, instead of manipulating the source buffer.
* decoder_api: added assertion on partial framesMax Kellermann2009-01-161-0/+1
| | | | Decoder plugins must not send partial frames.
* decoder_api: added G_GNUC_UNUSED attribute to decoder_initialized()Max Kellermann2009-01-151-1/+1
| | | | In NDEBUG, the parameter "decoder" is not used.
* decoder_api: don't ignore DECODE_COMMAND_STOPMax Kellermann2009-01-131-2/+1
| | | | | | When the decoder thread is waiting for free chunks in the music pipe, don't ignore the STOP command. Just return dc.command without further checks.
* pcm: added pcm_convert_deinit(), pcm_resample_deinit()Max Kellermann2009-01-071-2/+0
| | | | | Free memory allocated by libsamplerate when the output or the decoder is closed.
* song: allocate the result of song_get_url()Max Kellermann2009-01-041-3/+2
|
* input_stream: added tag() methodMax Kellermann2009-01-031-65/+59
| | | | | The tag() method reads a tag from the stream. This replaces the meta_name and meta_title attributes.
* decoder_api: moved code to do_send_tag(), free temporary tagMax Kellermann2009-01-031-7/+17
| | | | | | | This patch fixes a minor memory leak: when decoder_tag() attempted to send a merged tag object (created by tag_add_stream_tags()), and was interrupted by a decoder command, it did not free the temporary merged tag object.
* decoder_api: use GLib instead of utils.hMax Kellermann2009-01-031-4/+5
|
* pcm_utils: check pcm_convert()==0Max Kellermann2008-12-241-0/+7
| | | | | | | | It is illegal to pass an empty audio buffer around. pcm_resample() sometimes seems to result in 0 samples, maybe related to libsamplerate. To work around that problem, add special checks after both pcm_convert() invocations. Removed the pcm_resample()==0 checks from pcm_convert().
* decoder_api.c: replaced mpd_unused by G_GNUC_UNUSEDThomas Jansen2008-11-241-6/+7
|
* decoder: check audio_format_valid() in all decodersMax Kellermann2008-11-211-0/+1
| | | | Refuse to play audio formats which are not supported by MPD.
* decoder: ignore decoder_data() calls with length==0Max Kellermann2008-11-211-1/+2
| | | | | Pushing buffers with a zero length into the MPD core causes failures; don't let them pass beyond the decoder plugi API.
* decoder: pass the correct buffer length to pcm_convert()Max Kellermann2008-11-181-5/+6
| | | | | | | | When a global audio format is configured (setting "audio_output_format"), decoder_data() overwrote the "length" parameter with the size of the output buffer (result of pcm_convert_size()). Declare a separate variable for the output buffer length.
* decoder: check length==0 in decoder_read()Max Kellermann2008-11-151-0/+3
| | | | | When the caller passes length==0, decoder_read() entered an endless loop. Check that condition before entering the "while" loop.
* decoder: additional dc.command checks in decoder_data()Max Kellermann2008-11-131-0/+3
| | | | | When a command is sent while the decoder waits for a free chunk in the music pipe, it was not returned by decoder_data().
* decoder: wait for the player only if the music pipe is fullMax Kellermann2008-11-131-4/+5
| | | | Prevent superfluous wakeups and a deadlock condition.
* decoder: check dc.command at the beginning of decoder_data()Max Kellermann2008-11-131-0/+4
| | | | | | Seeking was somewhat broken in some decoder plugins because they sent empty chunks, and never got a command. Check the decoder command before doing anything else in decoder_data().
* decoder: ignore SEEK commands during initializationMax Kellermann2008-11-131-1/+4
| | | | | When the decoder receives a SEEK during initialization, it should ignore that for now. The old code made most decoders abort.
* replay_gain: no CamelCaseMax Kellermann2008-11-111-3/+3
| | | | Renamed functions and variables.
* decoder: fixed assertion failure for decoder==NULL in decoder_read()Max Kellermann2008-11-111-1/+2
| | | | | | The assertion on dc.state in decoder_read() was too strict: when a decoder tried to call decoder_read() from tag_dup(), the decoder state was NONE. Allow this special case.
* decoder: added more assertionsMax Kellermann2008-11-101-0/+10
| | | | Added a lot of assertions checking the state of the decoder plugin.