aboutsummaryrefslogtreecommitdiffstats
path: root/src/inputPlugins/mp3_plugin.c (follow)
Commit message (Collapse)AuthorAgeFilesLines
* mp3: hard-code dithering to 16 bitsMax Kellermann2008-10-101-8/+6
| | | | | | The dithering function audio_linear_dither() worked for signed 16 bits only anyway, having a variable "bits" just disables important gcc optimizations.
* audio_format: renamed sampleRate to sample_rateMax Kellermann2008-10-101-1/+1
| | | | | The last bit of CamelCase in audio_format.h. Additionally, rename a bunch of local variables.
* use C99 struct initializersMax Kellermann2008-09-291-10/+7
| | | | | | The old struct initializers are error prone and don't allow moving elements around. Since we are going to overhaul some of the APIs soon, it's easier to have all implementations use C99 initializers.
* Switch to C99 types (retaining compat with old compilers)Eric Wong2008-09-291-5/+5
| | | | | | | | | | | | | | | Seeing the "mpd_" prefix _everywhere_ is mind-numbing as the mind needs to retrain itself to skip over the first 4 tokens of a type to get to its meaning. So avoid having extra characters on my terminal to make it easier to follow code at 2:30 am in the morning. Please report any new issues you may come across on Free toolchains. I realize how difficult it can be to build/maintain cross-compiling toolchains and I have no intention of forcing people to upgrade their toolchains to build mpd. Tested with gcc 2.95.4 and and gcc 4.3.1 on x86-32.
* start using prefixcmp()Eric Wong2008-09-231-1/+1
| | | | | LOC reduction and less noise makes things easier for tired old folks to follow.
* mp3: fix long line, I can't read past 80 colsEric Wong2008-09-231-1/+2
|
* mp3: fix buffer overflow when max_frames is too largeMax Kellermann2008-09-171-0/+5
| | | | | | | The function decodeFirstFrame() allocates memory based on data from the mp3 header. This can make the buffer size allocation overflow, or lead to a DoS attack with a very large buffer. Cap this buffer at 8 million frames, which should really be enough for reasonable files.
* audio_format: converted typedef AudioFormat to struct audio_formatMax Kellermann2008-09-071-2/+2
| | | | | Get rid of CamelCase, and don't use a typedef, so we can forward-declare it, and unclutter the include dependencies.
* tag: renamed functions, no CamelCaseMax Kellermann2008-08-291-22/+21
|
* tag: renamed MpdTag and MpdTagItem to struct tag, struct mpd_tag_itemMax Kellermann2008-08-291-9/+9
| | | | | Getting rid of CamelCase; not having typedefs also allows us to forward-declare the structures.
* mp3, flac: check for seek command after decoder_read()Max Kellermann2008-08-261-1/+10
| | | | | | | When we introduced decoder_read(), we added code which aborts the read operation when a decoder command arrives. Several plugins however did not expect that when they were converted to decoder_read(). Add proper checks to the mp3 and flac decoder plugins.
* check decoder_command!=NONE instead of decoder_command==STOPMax Kellermann2008-08-261-7/+7
| | | | | | The code said "decoder_command==STOP" because that was a conversion from the old "dc->stop" test. As we can now check for all commands in one test, we can simply rewrite that to decoder_command!=NONE.
* mp3: converted the MUTEFRAME_ macros to an enumMax Kellermann2008-08-261-9/+12
| | | | Also introduce MUTEFRAME_NONE; previously, the code used "0".
* mp3: converted the DECODE_ constants to an enumMax Kellermann2008-08-261-8/+13
|
* added decoder_read()Max Kellermann2008-08-261-14/+6
| | | | | | | | | On our way to stabilize the decoder API, we will one day remove the input stream functions. The most basic function, read() will be provided by decoder_api.h with this patch. It already contains a loop (still with manual polling), error/eof handling and decoder command checks. This kind of code used to be duplicated in all decoder plugins.
* mp3: added mp3DecodeData.decoderMax Kellermann2008-08-261-9/+13
| | | | | | We need the decoder object at several places in the mp3 plugin. Add it to mp3DecodeData, so we don't have to pass it around in every function.
* mp3: audio_linear_dither() returns mpd_sint16Max Kellermann2008-08-261-11/+9
| | | | | | The return value of audio_linear_dither() is always casted to mpd_sint16. Returning long does not make sense, and consumed 8 bytes on a 64 bit platform.
* mp3: changed outputBuffer's type to mpd_sint16[]Max Kellermann2008-08-261-3/+3
| | | | | The output buffer always contains mpd_sint16; declaring it with that type saves several casts.
* mp3: moved num_samples calculation out of the loopMax Kellermann2008-08-261-5/+7
| | | | | The previous patch removed all loop specific dependencies from the num_samples formula; we can now calculate it before entering the loop.
* mp3: eliminated outputPtrMax Kellermann2008-08-261-14/+3
| | | | | | The output buffer is always flushed after being appended to, which allows us to assume it is always empty. Always start writing at outputBuffer, don't remember outputPtr.
* mp3: don't do a second flush in mp3_decode()Max Kellermann2008-08-261-17/+1
| | | | | | The previous patch made mp3Read() flush the output buffer in every iteration, which means we can eliminate the flush check after invoking mp3Read().
* mp3: always flush directly after decoding/ditheringMax Kellermann2008-08-261-15/+13
| | | | | Since we try to fill the buffer in every iteration, we assume that we should flush the output buffer at the end of each iteration.
* mp3: dither a whole block at a timeMax Kellermann2008-08-261-3/+9
| | | | | | Fill the whole output buffer at a time by using dither_buffer()'s ability to decode blocks. Calculate how many samples fit into the output buffer before each invocation.
* mp3: moved dropSamplesAtEnd check out of the loopMax Kellermann2008-08-261-21/+18
| | | | | | | Simplifying loops for performance: why check dropSamplesAtEnd in every iteration, when we could modify the loop boundary? The (writable) variable samplesLeft can be eliminated; add a write-once variable pcm_length instead, which is used for the loop condition.
* mp3: make samplesPerFrame more localMax Kellermann2008-08-261-2/+1
| | | | | | The variable samplesPerFrame is used only in one single closure. Make it local to this closure. The compiler will probably convert it to a register anyway.
* mp3: unsigned integersMax Kellermann2008-08-261-11/+11
|
* mp3: removed double cmd==STOP checkMax Kellermann2008-08-261-3/+0
| | | | | cmd has already been checked before, it cannot have changed meanwhile because it is a local variable.
* mp3: moved code to dither_buffer()Max Kellermann2008-08-261-14/+30
| | | | | | | | Preparing for simplifying and thus speeding up the dithering code: moved dithering to a separate function which contains a trivial loop. With this patch, only one sample is dithered at a time, but the following patches will allow us to dither a whole block at a time, without complicated buffer length checks.
* mp3: don't check dropSamplesAtStart in the loopMax Kellermann2008-08-261-7/+14
| | | | | Performance improvement by moving stuff out of a loop: skip part of the first frame before entering the loop.
* renamed InputPlugin to struct decoder_pluginMax Kellermann2008-08-261-2/+2
| | | | | | "decoder plugin" is a better name than "input plugin", since the plugin does not actually do the input - InputStream does. Also don't use typedef, so we can forward-declare it if required.
* eliminate OUTPUT_BUFFER_DC_STOP, OUTPUT_BUFFER_DC_SEEKMax Kellermann2008-08-261-3/+4
| | | | | (Ab)use the decoder_command enumeration, which has nearly the same values and the same meaning.
* added decoder_seek_where() and decoder_seek_error()Max Kellermann2008-08-261-6/+6
| | | | | Provide access to seeking for the decoder plugins; they have to know where to seek, and they need a way to tell us that seeking has failed.
* added decoder_command_finished() to decoder_api.hMax Kellermann2008-08-261-4/+4
| | | | | | | Some decoder commands are implemented in the decoder plugins, thus they need to have an API call to signal that their current command has been finished. Let them use the new decoder_command_finished() instead of the internal dc_command_finished().
* added decoder_get_command()Max Kellermann2008-08-261-20/+20
| | | | | | Another big patch which hides internal mpd APIs from decoder plugins: decoder plugins regularly poll dc->command; expose it with a decoder_api.h function.
* simplify several dc->command checksMax Kellermann2008-08-261-7/+3
| | | | | | Since we have merged dc->stop, dc->seek into one variable, we don't have to check both conditions at a time; we can replace "!stop && !seek" with "none".
* added parameter total_time to decoder_initialized()Max Kellermann2008-08-261-3/+1
| | | | | Similar to the previous patch: pass total_time instead of manipulating dc->totalTime directly.
* added audio_format parameter to decoder_initialized()Max Kellermann2008-08-261-3/+3
| | | | | | dc->audioFormat is set once by the decoder plugins before invoking decoder_initialized(); hide dc->audioFormat and let the decoder pass an AudioFormat pointer to decoder_initialized().
* added decoder_clear() and decoder_flush()Max Kellermann2008-08-261-4/+4
| | | | | | We are now beginning to remove direct structure accesses from the decoder plugins. decoder_clear() and decoder_flush() mask two very common buffer functions.
* added decoder_data()Max Kellermann2008-08-261-15/+16
| | | | | Moved all of the player-waiting code to decoder_data(), to make OutputBuffer more generic.
* added decoder_initialized()Max Kellermann2008-08-261-4/+3
| | | | | | | decoder_initialized() sets the state to DECODE_STATE_DECODE and wakes up the player thread. It is called by the decoder plugin after its internal initialization is finished. More arguments will be added later to prevent direct accesses to the DecoderControl struct.
* added struct decoderMax Kellermann2008-08-261-1/+2
| | | | | | The decoder struct should later be made opaque to the decoder plugin, because maintaining a stable struct ABI is quite difficult. The ABI should only consist of a small number of stable functions.
* added dc_command_finished()Max Kellermann2008-08-261-8/+4
| | | | | | | | dc_command_finished() is invoked by the decoder thread when it has finished a command (sent by the player thread). It resets dc.command and wakes up the player thread. This combination was used at a lot of places, and by introducing this function, the code will be more readable.
* merged start, stop, seek into DecoderControl.commandMax Kellermann2008-08-261-19/+32
| | | | | | | Much of the existing code queries all three variables sequentially. Since only one of them can be set at a time, this can be optimized and unified by merging all of them into one enum variable. Later, the "command" checks can be expressed in a "switch" statement.
* clean up CPP includesMax Kellermann2008-08-261-5/+0
| | | | | Include only headers which are really required. This speeds up compilation and helps detect cross-layer accesses.
* Make the OutputBuffer API more consistentEric Wong2008-04-131-7/+7
| | | | | | | | | | We had functions names varied between outputBufferFoo, fooOutputBuffer, and output_buffer_foo That was too confusing for my little brain to handle. And the global variable was somehow named 'cb' instead of the more obvious 'ob'... git-svn-id: https://svn.musicpd.org/mpd/trunk@7355 09075e82-0dd4-0310-85a5-a0d7c8717e4f
* Stop passing our single OutputBuffer object everywhereEric Wong2008-04-131-12/+10
| | | | | | | All of our main singleton data structures are implicitly shared, so there's no reason to keep passing them around and around in the stack and making our internal API harder to deal with. git-svn-id: https://svn.musicpd.org/mpd/trunk@7354 09075e82-0dd4-0310-85a5-a0d7c8717e4f
* Stop passing our single DecoderControl object everywhereEric Wong2008-04-131-38/+36
| | | | | | | This at least makes the argument list to a lot of our plugin functions shorter and removes a good amount of line nois^W^Wcode, hopefully making things easier to read and follow. git-svn-id: https://svn.musicpd.org/mpd/trunk@7353 09075e82-0dd4-0310-85a5-a0d7c8717e4f
* yet more unsigned integersMax Kellermann2008-04-121-4/+4
| | | git-svn-id: https://svn.musicpd.org/mpd/trunk@7287 09075e82-0dd4-0310-85a5-a0d7c8717e4f
* Drop metadata updates from HTTP for now (input HTTP, and shout)Eric Wong2008-04-121-4/+0
| | | | | | | | It is way more complicated than it should be; and locking it for thread-safety is too difficult. [merged r7183 from branches/ew] git-svn-id: https://svn.musicpd.org/mpd/trunk@7241 09075e82-0dd4-0310-85a5-a0d7c8717e4f
* Initial cut of fork() => pthreads() for decoder and playerEric Wong2008-04-121-0/+4
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | I initially started to do a heavy rewrite that changed the way processes communicated, but that was too much to do at once. So this change only focuses on replacing the player and decode processes with threads and using condition variables instead of polling in loops; so the changeset itself is quiet small. * The shared output buffer variables will still need locking to guard against race conditions. So in this effect, we're probably just as buggy as before. The reduced context-switching overhead of using threads instead of processes may even make bugs show up more or less often... * Basic functionality appears to be working for playing local (and NFS) audio, including: play, pause, stop, seek, previous, next, and main playlist editing * I haven't tested HTTP streams yet, they should work. * I've only tested ALSA and Icecast. ALSA works fine, Icecast metadata seems to get screwy at times and breaks song advancement in the playlist at times. * state file loading works, too (after some last-minute hacks with non-blocking wakeup functions) * The non-blocking (*_nb) variants of the task management functions are probably overused. They're more lenient and easier to use because much of our code is still based on our previous polling-based system. * It currently segfaults on exit. I haven't paid much attention to the exit/signal-handling routines other than ensuring it compiles. At least the state file seems to work. We don't do any cleanups of the threads on exit, yet. * Update is still done in a child process and not in a thread. To do this in a thread, we'll need to ensure it does proper locking and communication with the main thread; but should require less memory in the end because we'll be updating the database "in-place" rather than updating a copy and then bulk-loading when done. * We're more sensitive to bugs in 3rd party libraries now. My plan is to eventually use a master process which forks() and restarts the child when it dies: locking and communication with the main thread; but should require less memory in the end because we'll be updating the database "in-place" rather than updating a copy and then bulk-loading when done. * We're more sensitive to bugs in 3rd party libraries now. My plan is to eventually use a master process which forks() and restarts the child when it dies: master - just does waitpid() + fork() in a loop \- main thread \- decoder thread \- player thread At the beginning of every song, the main thread will set a dirty flag and update the state file. This way, if we encounter a song that triggers a segfault killing the main thread, the master will start the replacement main on the next song. * The main thread still wakes up every second on select() to check for signals; which affects power management. [merged r7138 from branches/ew] git-svn-id: https://svn.musicpd.org/mpd/trunk@7240 09075e82-0dd4-0310-85a5-a0d7c8717e4f