aboutsummaryrefslogtreecommitdiffstats
path: root/src/inputPlugins (unfollow)
Commit message (Collapse)AuthorFilesLines
2008-08-30mp3: always flush directly after decoding/ditheringMax Kellermann1-17/+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.
2008-08-30mp3: dither a whole block at a timeMax Kellermann1-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.
2008-08-30mp3: moved dropSamplesAtEnd check out of the loopMax Kellermann1-21/+19
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.
2008-08-30mp3: make samplesPerFrame more localMax Kellermann1-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.
2008-08-30mp3: unsigned integersMax Kellermann1-11/+11
2008-08-30mp3: moved code to dither_buffer()Max Kellermann1-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.
2008-08-30mp3: don't check dropSamplesAtStart in the loopMax Kellermann1-7/+14
Performance improvement by moving stuff out of a loop: skip part of the first frame before entering the loop.
2008-08-30aac: support decoding AAC streamsMax Kellermann1-2/+128
Copy some code from aac_decode() to aac_stream_decode() and apply necessary changes to allow streaming audio data. Both functions might be merged later.
2008-08-30aac: splitted aac_parse_header() from initAacBuffer()Max Kellermann1-11/+16
initAacBuffer() should really only initialize the buffer; currently, it also reads data from the input stream and parses the header. All of the AAC buffer code should probably be moved to a separate library anyway.
2008-08-30aac: check buffer lengthsMax Kellermann1-2/+3
The AAC plugin sometimes does not check the length of available data when checking for magic prefixes. Add length checks.
2008-08-30aac: use fillAacBuffer() instead of manual readingMax Kellermann1-16/+4
Eliminate some duplicated code by using fillAacBuffer().
2008-08-30find AAC framesMax Kellermann1-1/+35
Find AAC frames in the input and skip invalid data. This prepares AAC streaming.
2008-08-30aac: moved code to adts_check_frame()Max Kellermann1-11/+20
adts_check_frame() checks whether the buffer head is an AAC frame, and returns the frame length.
2008-08-30aac: moved code to aac_buffer_shift()Max Kellermann1-7/+14
Shifting from the buffer queue is a common operation, and should be provided as a separate function. Move code to aac_buffer_shift() and add a bunch of assertions.
2008-08-30aac: use inputStreamAtEOF()Max Kellermann1-5/+4
When checking for EOF, we should not check whether the read request has been fully satisified. The InputStream API does not guarantee that readFromInputStream() always fills the whole buffer, if EOF is not reached. Since there is the function inputStreamAtEOF() dedicated for this purpose, we should use it for EOF checking after readFromInputStream()==0.
2008-08-30aac: don't depend on consumed data in fillAacBuffer()Max Kellermann1-6/+10
Fill the AacBuffer even when nothing has been consumed yet. The function should not check for consumed data, but for free space at the end of the buffer.
2008-08-30aac: simplified fillAacBuffer()Max Kellermann1-33/+25
Return instead of putting all the code into a if-closure. That saves one level of indentation.
2008-08-30aac: make adtsParse() voidMax Kellermann1-3/+1
adtsParse() always returns 1, and its caller does not use the return value.
2008-08-30aac: use size_tMax Kellermann1-6/+6
2008-08-30aac: removed unused initAacBuffer() parametersMax Kellermann1-9/+3
Since we eliminated the parameters retFileread and retTagsize in all callers, we can now safely remove it from the function prototype.
2008-08-30eliminate unused variables in the AAC decoderMax Kellermann1-10/+2
2008-08-30audiofile: remove one indent level from audiofile pluginMax Kellermann1-27/+24
Anonymous code blocks just to declare variables look ugly. Move the variable declarations up and disband the code block.
2008-08-30audiofile: use break instead of local variable "eof"Max Kellermann1-3/+3
Similar to previous patch: eliminate one variable by using "break". This also simplifies the code since we can remove one level of indent. [ew: rewritten to match current API]
2008-08-30aac/mp4: removed local variable "eof" because it is unusedMax Kellermann2-17/+10
"break" is so much easier than "eof=1; continue;", when "!eof" is the loop condition.
2008-08-30clean up CPP includesMax Kellermann13-61/+0
Include only headers which are really required. This speeds up compilation and helps detect cross-layer accesses. [ew: minor fixups to not break on new core]
2008-08-30enable -Wpointer-arith, -Wstrict-prototypesMax Kellermann4-10/+11
Also enable -Wunused-parameter - this forces us to add the gcc "unused" attribute to a lot of parameters (mostly library callback functions), but it's worth it during code refactorizations.
2008-08-26Reimplement dynamic metadata handlingEric Wong2-9/+14
This has been tested for both playback of streams and outputting to streams, and seems to work fine with minimal locking. This reuses the sequence number infrastructure in OutputBuffer for synchronizing metadata payloads; so (IMNSHO) should be much more understandable than various flags being set here and there.. It could still use some cleanup and much testing, but synchronization issues should be minimal.
2008-08-20mp3_plugin: fix assertion during seekingEric Wong1-3/+3
data->muteFrame won't necessarily get cleared when it enters that block of code, so we don't signal the action as complete until it is actually cleared.
2008-08-19fix output buffer deadlock when daemonizingEric Wong3-3/+0
We spawned the output buffer thread before daemonizing in initPlayerData(), which is ultra bad because daemonizes forks and threads are not preserved on exit. Since playerData has been stripped bare by this core-rewrite anyways, move this code into the outputBuffer_* group and drop playerData.[ch] completely I completely forgot to test this :<
2008-08-16core rewrite (decode,player,outputBuffer,playlist)Eric Wong12-382/+275
This is a huge refactoring of the core mpd process. The queueing/buffering mechanism is heavily reworked. The player.c code has been merged into outputBuffer (the actual ring buffering logic is handled by ringbuf.c); and decode.c actually handles decoding stuff. The end result is several hundreds of lines shorter, even though we still have a lot of DEBUG statements left in there for tracing and a lot of assertions, too.
2008-06-30don't call seekInputStream(0) if r==0Max Kellermann1-1/+2
If nothing has been read from the input stream, we don't have to rewind it. git-svn-id: https://svn.musicpd.org/mpd/trunk@7397 09075e82-0dd4-0310-85a5-a0d7c8717e4f
2008-06-30eliminated local variable "to_read"Max Kellermann1-4/+3
The variable "to_read" is never modified except in the last iteration of the while loop. This means the while condition will never become false, as the body will break before that may be checked. git-svn-id: https://svn.musicpd.org/mpd/trunk@7396 09075e82-0dd4-0310-85a5-a0d7c8717e4f
2008-06-13mod: fix crashing on modtracker filesHans de Goede1-1/+1
This patch was taken from http://bugzilla.livna.org/show_bug.cgi?id=1987 and addresses bug 0001693[1] [1] - http://musicpd.org/mantis/view.php?id=1693 git-svn-id: https://svn.musicpd.org/mpd/trunk@7374 09075e82-0dd4-0310-85a5-a0d7c8717e4f
2008-06-01oggflac_plugin: fix build with libOggFLAC lib (libFLAC <= 7)Eric Wong1-1/+1
git-svn-id: https://svn.musicpd.org/mpd/trunk@7370 09075e82-0dd4-0310-85a5-a0d7c8717e4f
2008-04-15use dc.current_song instead of pc.current_songMax Kellermann1-1/+1
When we are in an input plugin, dc.current_song should already be set. Use it instead of pc.current_song. git-svn-id: https://svn.musicpd.org/mpd/trunk@7363 09075e82-0dd4-0310-85a5-a0d7c8717e4f
2008-04-13Make the OutputBuffer API more consistentEric Wong12-42/+42
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
2008-04-13Stop passing our single OutputBuffer object everywhereEric Wong12-86/+77
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
2008-04-13Stop passing our single DecoderControl object everywhereEric Wong12-244/+222
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
2008-04-13Get rid of PlayerControl inside the PlayerData structEric Wong1-1/+1
It actually increases our image size a small bit and may even hurt performance a very small bit, but makes the code less verbose and easier to manage. I don't see a reason for mpd to ever support playing multiple files at the same time (users can run multiple instances of mpd if they really want to play Zaireeka, but that's such an edge case it's not worth ever supporting in our code). git-svn-id: https://svn.musicpd.org/mpd/trunk@7352 09075e82-0dd4-0310-85a5-a0d7c8717e4f
2008-04-12replaced assertion with checkMax Kellermann1-2/+1
During my tests, it happened that data->position>newPosition. I have not yet fully understood why this can happen; for now, replace this with a run-time check. git-svn-id: https://svn.musicpd.org/mpd/trunk@7334 09075e82-0dd4-0310-85a5-a0d7c8717e4f
2008-04-12multiply num_samples with bytes_per_channelMax Kellermann1-1/+1
The patch "convert blocks until the buffer is full" did not update data->chunk_length correctly: it added the number of samples, not the number of bytes. Multiply that with bytes_per_channel git-svn-id: https://svn.musicpd.org/mpd/trunk@7332 09075e82-0dd4-0310-85a5-a0d7c8717e4f
2008-04-12missing num_channels check in previous patchMax Kellermann1-1/+1
In the patch "special optimized case for 16bit stereo", the check for "num_channels==2" was missing. git-svn-id: https://svn.musicpd.org/mpd/trunk@7331 09075e82-0dd4-0310-85a5-a0d7c8717e4f
2008-04-12special optimized case for 16bit stereoMax Kellermann1-3/+20
Not having to loop for every sample byte (depending on a variable unknown at compile time) saves a lot of CPU cycles. We could consider reimplementing this function with liboil... git-svn-id: https://svn.musicpd.org/mpd/trunk@7330 09075e82-0dd4-0310-85a5-a0d7c8717e4f
2008-04-12read num_channels onceMax Kellermann1-3/+4
Read frame->header.channels once, and pass only this integer to flac_convert(). git-svn-id: https://svn.musicpd.org/mpd/trunk@7329 09075e82-0dd4-0310-85a5-a0d7c8717e4f
2008-04-12assume the buffer is empty in flacWrite()Max Kellermann1-4/+3
flacWrite() is the only function which sets data->chunk_length. If we flush the buffer before we return, we can assume that it is always empty upon entering flacWrite(). git-svn-id: https://svn.musicpd.org/mpd/trunk@7328 09075e82-0dd4-0310-85a5-a0d7c8717e4f
2008-04-12convert blocks until the buffer is fullMax Kellermann1-23/+43
Move the inner loop which converts samples to flac_convert(). There it is isolated and easier to optimize. This function does not have to worry about buffer boundaries; the caller (i.e. flacWrite()) calculates how much is left and is responsible for flushing. That saves a lot of superfluous range checks within the loop. git-svn-id: https://svn.musicpd.org/mpd/trunk@7327 09075e82-0dd4-0310-85a5-a0d7c8717e4f
2008-04-12calculate bytes_per_channel, check for buffer flush onceMax Kellermann1-11/+14
Check for flushing the chunk buffer only once per sample, before iterating over channels and bytes. This saves another 5% CPU cycles. git-svn-id: https://svn.musicpd.org/mpd/trunk@7326 09075e82-0dd4-0310-85a5-a0d7c8717e4f
2008-04-12don't calculate bytes per sample within the loopMax Kellermann1-1/+2
AudioFormat.bits is volatile, and to read it, 3 pointers had to be deferenced. Calculate this value once. This speeds up this function by 5%. git-svn-id: https://svn.musicpd.org/mpd/trunk@7325 09075e82-0dd4-0310-85a5-a0d7c8717e4f
2008-04-12use unsigned integers and size_t in the flac pluginMax Kellermann2-4/+9
git-svn-id: https://svn.musicpd.org/mpd/trunk@7324 09075e82-0dd4-0310-85a5-a0d7c8717e4f
2008-04-12clean up CPP includesMax Kellermann1-0/+1
Try to only include headers which are really needed. We should particularly check all "headers including other headers". The long-term goal is to have a manageable, small API for plugins (decoders, output) without so many mpd internals cluttering the namespace. git-svn-id: https://svn.musicpd.org/mpd/trunk@7319 09075e82-0dd4-0310-85a5-a0d7c8717e4f