aboutsummaryrefslogtreecommitdiffstats
path: root/src/audioOutputs (follow)
Commit message (Collapse)AuthorAgeFilesLines
* jack: support for 24 bit samplesMax Kellermann2008-10-241-1/+32
| | | | | | When the audio source provides 24 bit samples, don't bother to convert (lossily) them to 16 bit before jack's floating point conversion - go directly from 24 bit to float.
* jack: moved code to jack_write_samples_16()Max Kellermann2008-10-241-14/+42
| | | | Move sample format dependent code to a separate function.
* jack: eliminated CamelCaseMax Kellermann2008-10-241-73/+76
| | | | | Renamed all variables and functions. Add the prefix "mpd_jack_" to function names.
* jack: added assertions against partial framesMax Kellermann2008-10-241-0/+2
| | | | We must never pass partial frames. Added assertions to debug this.
* jack: optimize local variablesMax Kellermann2008-10-241-9/+8
| | | | | Merge the variables "avail_data" and "avail_frames" into "available". Both variables are never used at the same time.
* jack: lockless data transfer to jack threadMax Kellermann2008-10-241-47/+15
| | | | | | | | The JACK documentation postulates that the process() callback must not block, therefore locking is forbidden. Anyway, the old code was racy. Remove all locks, and don't wait for more data to become available - just send to the port what is already in the buffer.
* jack: partial writes to ring bufferMax Kellermann2008-10-241-15/+15
| | | | | | Don't wait until there is room for the full data chunk passed to jack_playAudio(). Try to incrementally send as much as possible into the ring buffer.
* jack: added constant "frame_size"Max Kellermann2008-10-241-1/+2
| | | | | | Don't hard-code a frame size of "4" (16 bit stereo), calculate the sample size from sizeof(*buffer), and create the constant "frame_size".
* jack: fix indentationMax Kellermann2008-10-241-33/+33
| | | | Indent with tabs.
* alsa: added #ifdefs around SND_PCM_NO_AUTO_xxxMax Kellermann2008-10-141-0/+6
| | | | | | These macros are not available in older libasound versions (1.0.13 fails, 1.0.16 is ok). Ignore the configuration if the constants are not defined.
* oss: use unsigned integer for ioctl constantsMax Kellermann2008-10-141-12/+12
| | | | The OSS constants overflow a signed integer, use unsigned instead.
* oss: convert several macros to enumMax Kellermann2008-10-141-19/+25
| | | | C enums are nicer than CPP macros.
* alsa: optionally disable resampling and othersMax Kellermann2008-10-141-1/+15
| | | | | | Added mpd.conf options for disabling automatic resamling, sample format and channel conversion. This way, users may choose to override ALSA's automatic resampling, and use libsamplerate instead.
* shout: make the protocol configurableAaron McEwan2008-10-121-2/+25
| | | | | Added configuration parameter "protocol" which lets the user choose from 3 shout protocols. This adds support for real shoutcast servers.
* shout: use strcmp() instead of strncasecmp()Max Kellermann2008-10-121-2/+2
| | | | | | Case insensitivity isn't helpful, and comparing only the first 3 bytes of a configured value may encourage users to supply wrong or misleading values.
* alsa: fall back to 16 bit outputMax Kellermann2008-10-121-0/+11
| | | | | | If the sample format isn't supported by the device (i.e. 24 bit on low-end sound chips), fall back to 16 bit output. There is code in pcm_utils.c which converts PCM data to 16 bit.
* alsa: moved code to alsa_configure()Max Kellermann2008-10-121-13/+18
| | | | | Move code which loads configuration to alsa_configure(). This removes one indent level.
* alsa: don't override libasound's buffer_time and period_timeMax Kellermann2008-10-111-20/+19
| | | | | ALSA does a good job measuring its buffer_time and period_time. Don't override its defaults, unless the user demands it.
* alsa: re-enable blocking modeMax Kellermann2008-10-111-15/+2
| | | | | | | | Revert e4f5d6bd "re-enable-nonblocking, but sleep if busy". Non-blocking mode with manual sleeping doesn't help at all (by the way, the patch should have used snd_pcm_wait() instead of my_usleep()). ALSA knows much more about the hardware quirks, so we just let it do the job.
* oss: fix opening default OSS deviceMax Kellermann2008-10-111-1/+1
| | | | | | Leftover from the output API changes: oss_open_default() was changed to return a void*, but it still returned "0" to report success. Report the OssData pointer instead.
* mvp: unsinged integersMax Kellermann2008-10-101-4/+5
| | | | | | Fix some gcc warnings by using unsigned where appropriate. Declare numfrequencies as "const", and replaced the magic number 12 with a sizeof.
* mvp: adapt to the new output device APIMax Kellermann2008-10-101-20/+21
|
* mvp: missing includesMax Kellermann2008-10-101-0/+5
| | | | | Again, a plugin which was disabled in my test environment and suffered from compilation errors.
* oss: added OssData.audio_formatMax Kellermann2008-10-101-19/+20
| | | | This replaces the separate properties channels, sampleRate, bits.
* audio_format: added audio_format_frame_size()Max Kellermann2008-10-102-4/+3
| | | | | | | A frame contains one sample per channel, thus it is sample_size * channels. This patch includes some cleanup for various locations where the sample size for 24 bit audio was still 3 bytes (instead of 4).
* audio_format: renamed sampleRate to sample_rateMax Kellermann2008-10-1010-27/+27
| | | | | The last bit of CamelCase in audio_format.h. Additionally, rename a bunch of local variables.
* audio_format: unsigned integersMax Kellermann2008-10-103-6/+6
| | | | "bits" and "channels" cannot be negative.
* shout: removed DISABLED_SHOUT_ENCODER_PLUGINMax Kellermann2008-10-094-11/+4
| | | | | | | Having an array with disabled entries sucks. Removed that DISABLED_SHOUT_ENCODER_PLUGIN macro, and fill the plugin list only with plugins which are actually enabled. This should be done for all plugin types.
* don't include os_compat.hMax Kellermann2008-10-084-0/+12
| | | | | When there are standardized headers, use these instead of the bloated os_compat.h.
* audio_output: added method pause()Max Kellermann2008-09-292-1/+20
| | | | | | | | | | | | pause() puts the audio output into pause mode: if supported, it may perform a special action, which keeps the device open, but does not play anything. Output plugins like "shout" might want to play silence during pause, so their clients won't be disconnected. Plugins which do not support pausing will simply be closed, and have to be reopened when unpaused. This pach includes an implementation for the shout plugin, which sends silence chunks.
* use C99 struct initializersMax Kellermann2008-09-2910-90/+76
| | | | | | 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.
* removed union const_hackMax Kellermann2008-09-291-2/+4
| | | | | The union const_hack is only used at one place in the shout plugin. Remove its global type declaration.
* switch to C99 types, part IIMax Kellermann2008-09-292-2/+2
| | | | | Do full C99 integer type conversion in all modules which were not touched by Eric's merged patch.
* Switch to C99 types (retaining compat with old compilers)Eric Wong2008-09-292-3/+3
| | | | | | | | | | | | | | | 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.
* output: make "struct audio_output" opaque for output pluginsMax Kellermann2008-09-248-175/+184
| | | | | | | | | | | We have eliminated direct accesses to the audio_output struct from the all output plugins. Make it opaque for them, and move its real declaration to output_internal.h, similar to decoder_internal.h. Pass the opaque structure to plugin.init() only, which will return the plugin's data pointer on success, and NULL on failure. This data pointer will be passed to all other methods instead of the audio_output struct.
* output: added audio_output_closed()Max Kellermann2008-09-241-1/+1
| | | | | | The JACK output plugin needs to reset its "opened" flag when the JACK server fails. To prevent it from accessing the audio_output struct directly introduce the API function audio_output_closed().
* output: added audio_output_get_name()Max Kellermann2008-09-241-1/+1
| | | | | | Reduce direct accesses to the audio_output struct from the plugins: this time, eliminate all accesses to audio_output.name. The name is required by some plugins for log messages.
* output: set audio_output->open=1 in audio_output_task()Max Kellermann2008-09-2410-38/+1
| | | | | Since the output plugin returns a value indicating success or error, we can have the output core code assign the "open" flag.
* output: pass audio_format to plugin.init() and plugin.open()Max Kellermann2008-09-2410-30/+54
| | | | | | | Pass the globally configured audio_format as a const pointer to plugin.init(). plugin.open() gets a writable pointer which contains the audio_format requested by the plugin. Its initial value is either the configured audio_format or the input file's audio_format.
* audio_format: added audio_format_sample_size()Max Kellermann2008-09-234-4/+4
| | | | | | The inline function audio_format_sample_size() calculates how many bytes each sample consumes. This function already takes into account that 24 bit samples are 4 bytes long, not 3.
* alsa: re-enable-nonblocking, but sleep if busyEric Wong2008-09-231-7/+10
| | | | | | | Instead of letting ALSA block for us (and potentially allowing something stupid on certain hardware or drivers), we do the sleeping ourselves. We calculate the sleep to be a fraction of period_time to avoid oversleeping (and thus audible skipping).
* shout: don't write empty buffersMax Kellermann2008-09-121-2/+4
| | | | | Add a check to write_page() which checks if there is actually data. Don't bother to call shout_send() if there is not.
* shout: removed clear_shout_buffer()Max Kellermann2008-09-121-8/+2
| | | | | The function is trivial, without a benefit. Also don't initialize buf.data[0], this is not a null terminated string.
* shout: make the shout_buffer staticMax Kellermann2008-09-124-12/+4
| | | | | | | Since the buffer size is known at compile time, we can save an indirection by declaring it as a char array instead of a pointer. That saves an extra allocation, and we can calculate with the compile-time constant sizeof(data) instead of the attribute "max_len".
* shout: constant plugin declarationsMax Kellermann2008-09-124-7/+7
| | | | | Declare both shout plugins "const", since they will never change, once initialized at compile time.
* shout: static encoder plugin listMax Kellermann2008-09-121-35/+15
| | | | | | Shout encoder plugins are known at compile time. There is no reason to use a complex data structure as "List" to manage them at runtime - just put the pointers into a static array.
* shout: removed typedefs on structs and plugin methodsMax Kellermann2008-09-124-73/+65
| | | | | | | Don't typedef the structs at all. It is easier to forward-declare this way. Don't typedef methods. They are used exactly once, a few lines below.
* shout: added mp3 encoderEric Wollesen2008-09-123-0/+196
| | | | | | | | | | | | | [mk: moved this patch after "Refactor and cleanup of shout Ogg and MP3 audio outputs". The original commit message follows, although it is outdated:] Creation of shout_mp3 audio output plugin. Basically I just copied the existing shout plugin and replaced ogg with lame. Uses lame for mp3 encoding. Next step is to pull common functionality out of each shout plugin and share it between them. Configuration options for "shout_mp3" are the same as for "shout".
* shout: introduce pluggable encoder APIEric Wollesen2008-09-123-55/+177
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | I've perhaps gone a bit overboard, but here's the current rundown: Both Ogg and MP3 use the "shout" audio output plugin. The shout audio output plugin itself has two new plugins, one for the Ogg encoder, and another for the MP3 (LAME) encoder. Configuration for an Ogg stream doesn't change. For an MP3 stream, configuration is the same as Ogg, with two exceptions. First, you must specify the optional "encoding" parameter, which should be set to "mp3". See mpd.conf(5) for more details. Second, the "quality" parameter is reversed for LAME, such that 1 is high quality for LAME, whereas 10 is high quality for Ogg. I've decomposed the code so that all libshout related operations are done in audioOutput_shout.c, all Ogg specific functions are in audioOutput_shout_ogg.c, and of course then all LAME specific functions are handled in audioOutput_shout_mp3.c. To develop encoder plugins for the shout audio output plugin, I basically just mimicked the plugin system used for audio outputs. This might be overkill, but hopefully if anyone ever wants to support some other sort of stream, like maybe AAC, FLAC, or WMA (hey it could happen), they will hopefully be all set. The Ogg encoder is slightly less optimal under this configuration. It used to send shout data directly out of its ogg_page structures. Now, in the interest of encapsulation, it copies the data from its ogg_page structures into a buffer provided by the shout audio output plugin (see audioOutput_shout_ogg.c, line 77.) I suspect the performance impact is negligible. As for metadata, I'm pretty sure they'll both work. I wrote up a test scaffold that would create a fake tag, and tell the plugin to send it out to the stream every few seconds. It seemed to work fine. Of course, if something does break, I'll be glad to fix it. Lastly, I've renamed lots of things into snake_case, in keeping with normalperson's wishes in that regard. [mk: moved the MP3 patch after this one. Splitted this patch into several parts; the others were already applied before this one. Fixed a bunch GCC warnings and wrong whitespace modifications. Made it compile with mpd-mk by adapting to its prototypes]
* shout: send shout metadataEric Wollesen2008-09-123-5/+19
| | | | | | | | | Support sending metadata to a shout server using shout_metadata_new() and shout_metadata_add(). The Ogg Vorbis encoder does not support this currently. [mk: this patch was separated from Eric's patch "Refactor and cleanup of shout Ogg and MP3 audio outputs", I added a description]