aboutsummaryrefslogtreecommitdiffstats
path: root/src/song.c (follow)
Commit message (Collapse)AuthorAgeFilesLines
* song: skip archive check for non-musicdir filesMax Kellermann2009-01-171-1/+1
| | | | | | If a song is not within the music directory ("file:///..."), it has no "parent directory". The archive code nonetheless dereferences the parent pointer, causing a segmentation fault. Check parent!=NULL.
* moved fallback APE/ID3 tag loader to song.cMax Kellermann2009-01-171-0/+36
| | | | | | Some plugins used the APE or ID3 tag loader as a fallback when their own methods of loading tags did not work. Move this code out of all decoder plugins, into song_file_update().
* song: allocate the result of song_get_url()Max Kellermann2009-01-041-6/+4
|
* directory: added directory_is_root()Max Kellermann2009-01-041-1/+1
| | | | | directory_is_root() is cheaper than isRootDirectory(directory_get_path()).
* ls: renamed functions, no CamelCaseMax Kellermann2009-01-041-2/+2
|
* ls: removed hasMusicSuffix() and get_archive_by_suffix()Max Kellermann2009-01-041-16/+31
| | | | | | | | Determine the suffix manually, and use decoder_plugin_from_suffix() and archive_plugin_from_suffix() instead. This way, song_file_update_inarchive() can be optimized: it does not have to translate its path.
* song: removed duplicate '\n' checkMax Kellermann2009-01-041-5/+2
| | | | Newline characters are already checked in skip_path() (update.c).
* song: use GLib instead of utils.h/log.hMax Kellermann2009-01-031-5/+5
|
* mapper: allocate the result of map_directory_child_fs(), map_song_fs()Max Kellermann2009-01-021-7/+9
| | | | Don't use fixed stack buffers.
* removed os_compat.hMax Kellermann2008-12-291-0/+5
| | | | | Only include headers which are really needed. os_compat.h aimed to make MPD easily portable, but was never actually made portable.
* song: adding support for songs in archivesViliam Mateicka2008-12-161-1/+34
|
* decoder: return const decoder_plugin structsMax Kellermann2008-11-011-1/+1
| | | | | The decoder_plugin structs must never change. Don't work with non-const pointers.
* update: check return valuesMax Kellermann2008-10-311-5/+8
| | | | | Nearly all mapper functions can fail and will then return NULL. Add checks to all callers.
* song: check file type in song_file_update()Max Kellermann2008-10-151-1/+1
| | | | Don't load non-regular files.
* playlist: added support for adding songs not in the music databaseMax Kellermann2008-10-151-2/+2
| | | | | Clients which have authenticated via unix socket may add local files to the MPD playlist, provided that they own the file.
* mapper: new song-to-filesystem mapper libraryMax Kellermann2008-10-141-3/+2
| | | | | | The mapper library maps directory and song objects to file system paths. With this central library, the code mixture in path.c should be cleaned up, and we will be able to add neat features like aliasing.
* song: pass const song pointer to song_get_url()Max Kellermann2008-10-141-1/+1
| | | | song_get_url() doesn't modify the song object.
* song: stat file in song_file_update(), don't use isMusic()Max Kellermann2008-10-131-5/+8
| | | | | | | 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().
* song: song_get_url: fix "/" prefix for songs in music_rootEric Wong2008-10-131-1/+1
|
* directory: eliminate CamelCaseMax Kellermann2008-10-081-2/+2
| | | | CamelCase is ugly, rename the functions.
* song: don't allow calling song_get_url(NULL)Max Kellermann2008-10-081-3/+1
| | | | | | The runtime check suggests that the author has somehow thought song_get_url(NULL) might be valid. It should not be. Replace it with an assertion.
* song: use song_file_update() in song_file_load()Max Kellermann2008-10-081-10/+3
| | | | Eliminate duplicated code.
* song: song_file_update() returns boolMax Kellermann2008-10-081-3/+3
| | | | | | Instead of returning 0 or -1, return true on success and false on failure. This seems more natural, and when the C library was designed, there was no "bool" data type.
* song: don't check song_is_file() in song_file_update()Max Kellermann2008-10-081-17/+16
| | | | | This function was never used on remote songs. Replace the runtime check with an assertion.
* song: removed CamelCaseMax Kellermann2008-10-081-10/+10
| | | | CamelCase is ugly... rename all functions.
* song: replaced all song constructorsMax Kellermann2008-10-081-21/+32
| | | | | | Provide separate constructors for creating a remote song, a local song, and one for loading data from a song file. This way, we can add more assertions.
* don't include os_compat.hMax Kellermann2008-10-081-2/+0
| | | | | When there are standardized headers, use these instead of the bloated os_compat.h.
* song: converted typedef Song to struct songMax Kellermann2008-10-081-7/+11
| | | | Again, a data type which can be forward-declared.
* directory: converted typedef Directory to struct directoryMax Kellermann2008-10-081-2/+2
| | | | | The struct can be forward-declared by other headers, which relaxes the header dependencies.
* directory: serialize song deletes from playlist during updateEric Wong2008-10-071-6/+0
| | | | | | | | | | | | | | | | This makes the update code thread-safe and doesn't penalize the playlist code by complicating it with complicated and error-prone locks (and the associated overhead, not everybody has a thread-implementation as good as NPTL). The update task blocks during the delete; but the update task is a slow task anyways so we can block w/o people caring too much. This was also our only freeSong call site, so remove that function. Note that deleting entire directories is not fully thread-safe, yet; as their traversals are not yet locked.
* Assert if we don't have song or song->url setEric Wong2008-10-071-2/+8
| | | | song objects cannot exist without a path or URL
* song: stop storing song_typeEric Wong2008-10-061-8/+5
| | | | | | | We already know if a song is a URL or not based on whether it has parentDir defined or not. Hopefully one day in the future we can drop HTTP support from MPD entirely when an HTTP filesystem comes along and we can access streams via open(2).
* song: don't make the struct packedMax Kellermann2008-10-061-1/+1
| | | | | | The "packed" attribute may have negative side effects on performance. Remove the "packed" attribute, and increase the size of "song.url" to a multiple of the machine word size.
* song: use flex arrays to store song->urlEric Wong2008-10-061-7/+15
| | | | | | Reduce the number of allocations we make, so there's less pressure on the allocator and less overhead to keep track of the allocations in.
* song: get rid of newNullSong()Eric Wong2008-10-061-13/+2
| | | | | It didn't save us any lines of code nor did it do anything useful since we would overwrite everything anyways.
* song: call freeJustSong if newSong failsEric Wong2008-10-061-1/+1
| | | | | There's no reason to scan the playlist for a song we just allocated.
* decoder: renamed plugin methodsMax Kellermann2008-09-291-2/+2
| | | | | Why have a "_func" prefix on all method names? Also don't typedef the methods, there is no advantage in that.
* song: converted "type" to enumMax Kellermann2008-09-291-1/+1
| | | | | | Having an enum type is much nicer than an anonymous integer plus CPP macros. Note that the old code didn't save any space by declaring the variable 8 bit, due to padding.
* song: removed type SongListMax Kellermann2008-09-261-36/+0
| | | | SongList has been superseded by struct songvec.
* Replace SongList with struct songvecEric Wong2008-09-231-0/+1
| | | | | | | Our linked-list implementation is wasteful and the SongList isn't modified enough to benefit from being a linked list. So use a more compact array of song pointers which saves ~200K on a library with ~9K songs (on x86-32).
* song: moved code to song_print.c, song_save.cMax Kellermann2008-09-071-172/+1
| | | | | | | Move everything which dumps song information (via tag_print.c) to a separate source file. song_print.c gets code which writes song data to the client; song_save.c is responsible for serializing songs from the tag cache.
* tag: moved code to tag_print.cMax Kellermann2008-09-071-0/+1
| | | | | Move everything which dumps a tag to a file descriptor to tag_print.c. This relaxes dependencies and splits the code into smaller parts.
* tag: fix segfault on updateEric Wong2008-09-061-0/+1
| | | | | | | | | | | | clearMpdTag could be called on a tag that was still in a tag_begin_add transaction before tag_end_add is called. This was causing free() to attempt to operate on bulk.items; which is un-free()-able. Now instead we unmark the bulk.busy to avoid committing the tags to the heap only to be immediately freed. Additionally, we need to remember to call tag_end_add() when a song is updated before we NULL song->tag to avoid tripping an assertion the next time tag_begin_add() is called.
* tag: try not to reallocate tag.items in every add() callMax Kellermann2008-08-291-4/+16
| | | | | | | | | | | | | | | | If many tag_items are added at once while the tag cache is being loaded, manage these items in a static fixed list, instead of reallocating the list with every newly created item. This reduces heap fragmentation. Massif results again: mk before: total 12,837,632; useful 10,626,383; extra 2,211,249 mk now: total 12,736,720; useful 10,626,383; extra 2,110,337 The "useful" value is the same since this patch only changes the way we allocate the same amount of memory, but heap fragmentation was reduced by 5%.
* song: don't export newNullSong()Max Kellermann2008-08-291-1/+1
| | | | The function newNullSong() is only used internally in song.c.
* tag: renamed functions, no CamelCaseMax Kellermann2008-08-291-10/+10
|
* assert song->url != NULLMax Kellermann2008-08-261-0/+3
|
* no camel case in struct decoder_pluginMax Kellermann2008-08-261-2/+2
|
* renamed inputPlugin.* to decoder_list.*Max Kellermann2008-08-261-1/+1
| | | | | Since inputPlugin.c manages the list of registered decoders, we should rename the source file.
* renamed InputPlugin to struct decoder_pluginMax Kellermann2008-08-261-2/+3
| | | | | | "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.