Commit Graph

2712 Commits

Author SHA1 Message Date
Eric Wong
06c8a9ed0b {dir,song}vec: fix off-by-one errors in {dir,song}vec_delete
Found by Valgrind while looking for another bug...

Hmm.. I should really just make this code generic since
they're duplicated...
2008-10-14 11:10:00 +02:00
Max Kellermann
f71ac4d479 song: stat file in song_file_update(), don't use isMusic()
isMusic() used to be a very inefficient function: with every
invocation, it did another stat() on the specified file.  There is
only one caller, do the stat() there manually and use hasMusicSuffix()
instead of isMusic().
2008-10-13 16:56:00 +02:00
Max Kellermann
94a5a5a985 update: always look up parent directory in updatePath()
By always creating the parent directory, we can use delete_name_in()
without further lookups.  The parents which may non exist will be
pruned later.  An update request for a non-existing or empty directory
should be quite unusual, so this doesn't add any measurable overhead.
2008-10-13 16:55:55 +02:00
Max Kellermann
a52343732b update: pass base file name to updateInDirectory()
In order to optimize buffer usage, pass only the base file name to
updateInDirectory().  This way, updateInDirectory() may choose when to
allocate a larger buffer for the full path.
2008-10-13 16:55:54 +02:00
Max Kellermann
270a6ebd69 update: moved code to make_subdir() 2008-10-13 16:46:51 +02:00
Max Kellermann
3e9ed15e76 update: added delete_name_in()
delete_name_in() is similar to delete_path(), but it does not need to
look up the parent directory.
2008-10-13 16:46:32 +02:00
Max Kellermann
69617438a9 dirvec: dirvec_find() compares basename
It is invalid to pass a path with the wrong dirname to dirvec_find().
To be able to find a subdirectory only by its basename, compare only
the basename of both paths.
2008-10-13 16:33:04 +02:00
Max Kellermann
3b6ff84393 directory: added directory_get_name()
directory_get_name() returns the base name of the directory.
2008-10-13 16:32:39 +02:00
Max Kellermann
bc85e92a72 playlist: don't use isPlaylist() in deletePlaylist()
The only caller of deletePlaylist() appends PLAYLIST_FILE_SUFFIX, so
we can be sure it's already there.  We don't need to stat the file,
since unlink() does all the checking.
2008-10-13 16:30:44 +02:00
Max Kellermann
07c9b62764 audio: don't clear input_audio_format on openAudioDevice(NULL)
Commit 80a2c937 broke resume after pause: it cleared the
input_audio_format when it attempted to simplify a complicated
expression.  Don't clear it, just assign input_audio_format if a new
format was specified.
2008-10-13 14:31:18 +02:00
Max Kellermann
5ea2e198f9 directory: pass const pointers to inline functions
The inline functions directory_is_empty() and directory_get_path()
don't modify the object - pass constant object pointers to them.
2008-10-13 09:56:57 +02:00
Eric Wong
313405edb6 songvec: avoid holding nr_lock during free(3)
We only need to lock sv->nr changes to prevent traversals ( why
it's called "nr_lock").  free(3) is a "slow" function on my
system; so we can avoid unnecessarily holding a lock long for
longer than needed.
2008-10-13 09:55:07 +02:00
Eric Wong
3035a3303d update: allow music_root updates to be queued
Previously only updates with subdirectories being
specified could be queued.  No harm in queueing
full updates.
2008-10-13 09:55:03 +02:00
Eric Wong
8d907fb9fa directory: use mpd_sizeof_str_flex_array for path, too
This way we avoid unnecessary heap allocations.
2008-10-13 09:55:00 +02:00
Eric Wong
8867bd554c tag_item: avoid wasting space when struct is unpackable
Not all compilers support struct packing, and those that don't
shouldn't be punished for it.
2008-10-13 09:40:14 +02:00
Eric Wong
c641aabe33 song: song_get_url: fix "/" prefix for songs in music_root 2008-10-13 09:39:02 +02:00
Aaron McEwan
2139d8bba8 shout: make the protocol configurable
Added configuration parameter "protocol" which lets the user choose
from 3 shout protocols.  This adds support for real shoutcast servers.
2008-10-12 12:14:51 +02:00
Max Kellermann
ff69f12259 shout: use strcmp() instead of strncasecmp()
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.
2008-10-12 12:13:27 +02:00
Max Kellermann
ffed2fdca7 alsa: fall back to 16 bit output
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.
2008-10-12 12:02:55 +02:00
Max Kellermann
9b0693d8ef pcm_utils: support any number of channels in pcm_sizeOfConvBuffer()
When calculating the conversion buffer size, don't hard-code the
formulas for only mono<->stereo.
2008-10-12 12:02:54 +02:00
Max Kellermann
c0ecce5498 pcm_utils: support converting N channels to stereo
Convert any number of channels to stereo.  In fact, this isn't really
stereo, it's rater mono blown up to stereo.  This patch should only
make it possible to play 5.1 files at all; "real" conversion to stereo
should be implemented, but for now, this is better than nothing.
2008-10-12 12:02:52 +02:00
Max Kellermann
52949453df pcm_utils: pass output channel count to pcm_convertChannels()
In order to be able to deal with non-trivial conversions,
pcm_convertChannels() needs to know both the input and the output
channel count.  Simplify buffer allocation in that function.
2008-10-12 11:51:19 +02:00
Max Kellermann
a7924d141d pcm_utils: moved code from pcm_convertChannels() to separate functions
Moved code from pcm_convertChannels() to pcm_convert_channels_1_to_2()
and pcm_convert_channels_2_to_1().  Improved the quality of
pcm_convert_channels_2_to_1() by calculating the arithmetic mean value
of both samples.
2008-10-12 11:47:42 +02:00
Max Kellermann
1a74d7be41 alsa: moved code to alsa_configure()
Move code which loads configuration to alsa_configure().  This removes
one indent level.
2008-10-12 11:47:33 +02:00
Max Kellermann
0d3a6ff669 pcm_utils: pass int16_t* where appropriate
Pass int16_t pointers instead of char pointers to functions which can
deal with 16 bit audio only.
2008-10-12 11:28:37 +02:00
Max Kellermann
08210af23a player: replaced buffered_before_play with buffering flag
buffered_before_play was copied to struct player because it was used
to disable buffering when seeking.  Instead of mainaining a copy of
this number, move just the flag to the player struct.
2008-10-12 01:21:35 +02:00
Max Kellermann
80a2c937c4 audio: renamed the audio_format variables
Renamed audio_configFormat to configured_audio_format.  Renamed
audio_buffer.format to input_audio_format.  Simplified its
initialization in openAudioDevice().
2008-10-12 01:00:00 +02:00
Max Kellermann
336b193097 audio: removed enum ad_state
All what's left from ad_state is a simple boolean flag (ENABLE /
DISABLE).  Convert it to a C99 bool.
2008-10-12 00:48:59 +02:00
Max Kellermann
c297c8555f audio: removed audio_buffer.buffer
audio.c maintained one of MPD's many layers of audio buffers.  It was
without any benefit, since playAudio() can simply send the source
buffer directly to the audio output plugin.
2008-10-12 00:42:33 +02:00
Max Kellermann
ea25688e46 output_buffer: converted ob_is_empty() to inline
The function ob_is_empty() is called very often.  It's worth it to
convert it to an inline function.
2008-10-12 00:42:22 +02:00
Max Kellermann
35a939e3e7 player: added commands QUEUE and CANCEL
QUEUE adds a new song to the player's queue.  CANCEL clears the queue.
These two commands replace the old and complex queueState and
queueLockState code.
2008-10-12 00:07:54 +02:00
Max Kellermann
35a16b9923 playlist: call clearPlayerQueue() only if song is queued
Simplify and merge several if clauses before the clearPlayerQueue()
invocation.  Call clearPlayerQueue() only if a song is actually
queued; add an assertion for that in clearPlayerQueue().
2008-10-12 00:03:27 +02:00
Max Kellermann
9d51bd392b player: added struct player
The player struct holds the local variables which used to be passed to
all those helper functions in player_thread.c.
2008-10-12 00:02:23 +02:00
Max Kellermann
2fcbabf4d1 player: removed set_current_song()
set_current_song() is an internal function and consists of only one
assignment.  Eliminate it.
2008-10-11 12:52:57 +02:00
Max Kellermann
42409a35e2 player: removed player_control.fileTime
This variable is superfluous, it is only used to copy its value to
player_control.totalTime.  Since the original source of this value
(song->tag->time) will still be available at this point, we can safely
remove fileTime.
2008-10-11 12:52:51 +02:00
Max Kellermann
dd7711d86c alsa: don't override libasound's buffer_time and period_time
ALSA does a good job measuring its buffer_time and period_time.  Don't
override its defaults, unless the user demands it.
2008-10-11 12:52:48 +02:00
Max Kellermann
bcc443a8aa alsa: re-enable blocking mode
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.
2008-10-11 12:47:20 +02:00
Max Kellermann
215d8aa8f6 oss: fix opening default OSS device
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.
2008-10-11 12:40:48 +02:00
Max Kellermann
17d9c1708b player: don't wake up decoder after every frame
The decoder was woken up after each chunk which had been played.  That
caused a lot of superfluous context switches.  Wake up the decoder
only when a certain amount of the buffer has been consumed.  This
formula is somewhat arbitrary, and has to be proven experimentally.
2008-10-10 16:47:57 +02:00
Max Kellermann
f41fe1e0b5 mp3: dither an arbitrary number of channels
The mp3 plugin did not use the MAD_NCHANNELS() value correctly: when a
stream was not stereo, it was assumed to be mono, although the correct
number was passed to MPD.  libmad doesn't support more than 2
channels, but this change allows gcc to optimize its inlining
strategy.
2008-10-10 16:40:48 +02:00
Max Kellermann
bac136608d mp3: hard-code dithering to 16 bits
The dithering function audio_linear_dither() worked for signed 16 bits
only anyway, having a variable "bits" just disables important gcc
optimizations.
2008-10-10 16:34:52 +02:00
Max Kellermann
5de7521900 player: added player_get_audio_format()
player_get_audio_format() replaces getPlayerSampleRate(),
getPlayerBits(), getPlayerChannels().
2008-10-10 14:51:22 +02:00
Max Kellermann
0b4dfae22e player: added player_control.audio_format
This replaces the attributes bits, channels, sampleRate.
2008-10-10 14:47:58 +02:00
Max Kellermann
8c33b64847 mvp: unsinged integers
Fix some gcc warnings by using unsigned where appropriate.  Declare
numfrequencies as "const", and replaced the magic number 12 with a
sizeof.
2008-10-10 14:47:58 +02:00
Max Kellermann
cec9264d24 mvp: adapt to the new output device API 2008-10-10 14:47:56 +02:00
Max Kellermann
7d9bedc3aa mvp: missing includes
Again, a plugin which was disabled in my test environment and suffered
from compilation errors.
2008-10-10 14:47:54 +02:00
Max Kellermann
8fc6b93afc oss: added OssData.audio_format
This replaces the separate properties channels, sampleRate, bits.
2008-10-10 14:42:30 +02:00
Max Kellermann
96155a3376 audio_format: added audio_format_frame_size()
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).
2008-10-10 14:41:37 +02:00
Max Kellermann
de2cb3f375 audio_format: renamed sampleRate to sample_rate
The last bit of CamelCase in audio_format.h.  Additionally, rename a
bunch of local variables.
2008-10-10 14:40:54 +02:00
Max Kellermann
6101dc6c76 audio_format: unsigned integers
"bits" and "channels" cannot be negative.
2008-10-10 14:03:33 +02:00