aboutsummaryrefslogtreecommitdiffstats
path: root/src/inputPlugins (follow)
Commit message (Collapse)AuthorAgeFilesLines
* mp3: moved num_samples calculation out of the loopMax Kellermann2008-08-301-6/+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-301-17/+9
| | | | | | 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-301-12/+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-301-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.
* mp3: dither a whole block at a timeMax Kellermann2008-08-301-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-301-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.
* mp3: make samplesPerFrame more localMax Kellermann2008-08-301-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-301-11/+11
|
* mp3: moved code to dither_buffer()Max Kellermann2008-08-301-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-301-7/+14
| | | | | Performance improvement by moving stuff out of a loop: skip part of the first frame before entering the loop.
* aac: support decoding AAC streamsMax Kellermann2008-08-301-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.
* aac: splitted aac_parse_header() from initAacBuffer()Max Kellermann2008-08-301-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.
* aac: check buffer lengthsMax Kellermann2008-08-301-2/+3
| | | | | The AAC plugin sometimes does not check the length of available data when checking for magic prefixes. Add length checks.
* aac: use fillAacBuffer() instead of manual readingMax Kellermann2008-08-301-16/+4
| | | | Eliminate some duplicated code by using fillAacBuffer().
* find AAC framesMax Kellermann2008-08-301-1/+35
| | | | | Find AAC frames in the input and skip invalid data. This prepares AAC streaming.
* aac: moved code to adts_check_frame()Max Kellermann2008-08-301-11/+20
| | | | | adts_check_frame() checks whether the buffer head is an AAC frame, and returns the frame length.
* aac: moved code to aac_buffer_shift()Max Kellermann2008-08-301-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.
* aac: use inputStreamAtEOF()Max Kellermann2008-08-301-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.
* aac: don't depend on consumed data in fillAacBuffer()Max Kellermann2008-08-301-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.
* aac: simplified fillAacBuffer()Max Kellermann2008-08-301-33/+25
| | | | | Return instead of putting all the code into a if-closure. That saves one level of indentation.
* aac: make adtsParse() voidMax Kellermann2008-08-301-3/+1
| | | | | adtsParse() always returns 1, and its caller does not use the return value.
* aac: use size_tMax Kellermann2008-08-301-6/+6
|
* aac: removed unused initAacBuffer() parametersMax Kellermann2008-08-301-9/+3
| | | | | Since we eliminated the parameters retFileread and retTagsize in all callers, we can now safely remove it from the function prototype.
* eliminate unused variables in the AAC decoderMax Kellermann2008-08-301-10/+2
|
* audiofile: remove one indent level from audiofile pluginMax Kellermann2008-08-301-27/+24
| | | | | Anonymous code blocks just to declare variables look ugly. Move the variable declarations up and disband the code block.
* audiofile: use break instead of local variable "eof"Max Kellermann2008-08-301-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]
* aac/mp4: removed local variable "eof" because it is unusedMax Kellermann2008-08-302-17/+10
| | | | | "break" is so much easier than "eof=1; continue;", when "!eof" is the loop condition.
* clean up CPP includesMax Kellermann2008-08-3013-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]
* enable -Wpointer-arith, -Wstrict-prototypesMax Kellermann2008-08-304-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.
* Reimplement dynamic metadata handlingEric Wong2008-08-262-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.
* mp3_plugin: fix assertion during seekingEric Wong2008-08-201-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.
* fix output buffer deadlock when daemonizingEric Wong2008-08-193-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 :<
* core rewrite (decode,player,outputBuffer,playlist)Eric Wong2008-08-1612-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.
* don't call seekInputStream(0) if r==0Max Kellermann2008-06-301-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
* eliminated local variable "to_read"Max Kellermann2008-06-301-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
* mod: fix crashing on modtracker filesHans de Goede2008-06-131-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
* oggflac_plugin: fix build with libOggFLAC lib (libFLAC <= 7)Eric Wong2008-06-011-1/+1
| | | git-svn-id: https://svn.musicpd.org/mpd/trunk@7370 09075e82-0dd4-0310-85a5-a0d7c8717e4f
* use dc.current_song instead of pc.current_songMax Kellermann2008-04-151-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
* Make the OutputBuffer API more consistentEric Wong2008-04-1312-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
* Stop passing our single OutputBuffer object everywhereEric Wong2008-04-1312-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
* Stop passing our single DecoderControl object everywhereEric Wong2008-04-1312-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
* Get rid of PlayerControl inside the PlayerData structEric Wong2008-04-131-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
* replaced assertion with checkMax Kellermann2008-04-121-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
* multiply num_samples with bytes_per_channelMax Kellermann2008-04-121-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
* missing num_channels check in previous patchMax Kellermann2008-04-121-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
* special optimized case for 16bit stereoMax Kellermann2008-04-121-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
* read num_channels onceMax Kellermann2008-04-121-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
* assume the buffer is empty in flacWrite()Max Kellermann2008-04-121-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
* convert blocks until the buffer is fullMax Kellermann2008-04-121-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
* calculate bytes_per_channel, check for buffer flush onceMax Kellermann2008-04-121-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