diff options
-rw-r--r-- | NEWS | 8 | ||||
-rw-r--r-- | src/decoder/ffmpeg_plugin.c | 4 | ||||
-rw-r--r-- | src/decoder/wavpack_plugin.c | 2 | ||||
-rw-r--r-- | src/mapper.c | 13 | ||||
-rw-r--r-- | src/mapper.h | 2 | ||||
-rw-r--r-- | src/mixer_control.c | 4 | ||||
-rw-r--r-- | src/playlist_save.c | 5 | ||||
-rw-r--r-- | src/stored_playlist.c | 30 | ||||
-rw-r--r-- | src/tag_id3.c | 2 |
9 files changed, 53 insertions, 17 deletions
@@ -79,6 +79,14 @@ ver 0.16 (20??/??/??) ver 0.15.7 (2009/??/??) +* tags: + - id3: fix ID3v1 charset conversion +* decoders: + - ffmpeg: don't try to force stereo +* mixer: explicitly close all mixers on shutdown +* mapper: fix memory leak when playlist_directory is not set +* mapper: apply filesystem_charset to playlists +* command: verify playlist name in the "rm" command ver 0.15.6 (2009/11/18) diff --git a/src/decoder/ffmpeg_plugin.c b/src/decoder/ffmpeg_plugin.c index af9320322..d9a5f7feb 100644 --- a/src/decoder/ffmpeg_plugin.c +++ b/src/decoder/ffmpeg_plugin.c @@ -311,10 +311,6 @@ ffmpeg_decode_internal(struct ffmpeg_context *ctx) total_time = 0; - if (codec_context->channels > 2) { - codec_context->channels = 2; - } - if (!audio_format_init_checked(&audio_format, codec_context->sample_rate, ffmpeg_sample_format(codec_context), diff --git a/src/decoder/wavpack_plugin.c b/src/decoder/wavpack_plugin.c index dffa078f9..68a958788 100644 --- a/src/decoder/wavpack_plugin.c +++ b/src/decoder/wavpack_plugin.c @@ -74,7 +74,7 @@ format_samples_int(int bytes_per_sample, void *buffer, uint32_t count) switch (bytes_per_sample) { case 1: { - uchar *dst = buffer; + int8_t *dst = buffer; /* * The asserts like the following one are because we do the * formatting of samples within a single buffer. The size diff --git a/src/mapper.c b/src/mapper.c index bc3647686..0c3348aa1 100644 --- a/src/mapper.c +++ b/src/mapper.c @@ -192,14 +192,19 @@ map_spl_path(void) char * map_spl_utf8_to_fs(const char *name) { - char *filename = g_strconcat(name, PLAYLIST_FILE_SUFFIX, NULL); - char *path; + char *filename_utf8, *filename_fs, *path; if (playlist_dir == NULL) return NULL; - path = g_build_filename(playlist_dir, filename, NULL); - g_free(filename); + filename_utf8 = g_strconcat(name, PLAYLIST_FILE_SUFFIX, NULL); + filename_fs = utf8_to_fs_charset(filename_utf8); + g_free(filename_utf8); + if (filename_fs == NULL) + return NULL; + + path = g_build_filename(playlist_dir, filename_fs, NULL); + g_free(filename_fs); return path; } diff --git a/src/mapper.h b/src/mapper.h index d63243ff7..12108cbeb 100644 --- a/src/mapper.h +++ b/src/mapper.h @@ -99,6 +99,8 @@ map_spl_path(void); * Maps a playlist name (without the ".m3u" suffix) to a file system * path. The return value is allocated on the heap and must be freed * with g_free(). + * + * @return the path in file system encoding, or NULL if mapping failed */ char * map_spl_utf8_to_fs(const char *name); diff --git a/src/mixer_control.c b/src/mixer_control.c index 42b59f51e..af01600a1 100644 --- a/src/mixer_control.c +++ b/src/mixer_control.c @@ -50,6 +50,10 @@ mixer_free(struct mixer *mixer) assert(mixer->plugin != NULL); assert(mixer->mutex != NULL); + /* mixers with the "global" flag set might still be open at + this point (see mixer_auto_close()) */ + mixer_close(mixer); + g_mutex_free(mixer->mutex); mixer->plugin->finish(mixer); diff --git a/src/playlist_save.c b/src/playlist_save.c index 247b08e4c..235842ae8 100644 --- a/src/playlist_save.c +++ b/src/playlist_save.c @@ -72,12 +72,15 @@ spl_save_queue(const char *name_utf8, const struct queue *queue) char *path_fs; FILE *file; + if (map_spl_path() == NULL) + return PLAYLIST_RESULT_DISABLED; + if (!spl_valid_name(name_utf8)) return PLAYLIST_RESULT_BAD_NAME; path_fs = map_spl_utf8_to_fs(name_utf8); if (path_fs == NULL) - return PLAYLIST_RESULT_DISABLED; + return PLAYLIST_RESULT_BAD_NAME; if (g_file_test(path_fs, G_FILE_TEST_EXISTS)) { g_free(path_fs); diff --git a/src/stored_playlist.c b/src/stored_playlist.c index 14c9ac70a..1007da6f8 100644 --- a/src/stored_playlist.c +++ b/src/stored_playlist.c @@ -153,9 +153,12 @@ spl_save(GPtrArray *list, const char *utf8path) assert(utf8path != NULL); + if (map_spl_path() == NULL) + return PLAYLIST_RESULT_DISABLED; + path_fs = map_spl_utf8_to_fs(utf8path); if (path_fs == NULL) - return PLAYLIST_RESULT_DISABLED; + return PLAYLIST_RESULT_BAD_NAME; while (!(file = fopen(path_fs, "w")) && errno == EINTR); g_free(path_fs); @@ -179,7 +182,7 @@ spl_load(const char *utf8path) char buffer[MPD_PATH_MAX]; char *path_fs; - if (!spl_valid_name(utf8path)) + if (!spl_valid_name(utf8path) || map_spl_path() == NULL) return NULL; path_fs = map_spl_utf8_to_fs(utf8path); @@ -300,12 +303,15 @@ spl_clear(const char *utf8path) char *path_fs; FILE *file; + if (map_spl_path() == NULL) + return PLAYLIST_RESULT_DISABLED; + if (!spl_valid_name(utf8path)) return PLAYLIST_RESULT_BAD_NAME; path_fs = map_spl_utf8_to_fs(utf8path); if (path_fs == NULL) - return PLAYLIST_RESULT_DISABLED; + return PLAYLIST_RESULT_BAD_NAME; while (!(file = fopen(path_fs, "w")) && errno == EINTR); g_free(path_fs); @@ -324,9 +330,15 @@ spl_delete(const char *name_utf8) char *path_fs; int ret; + if (map_spl_path() == NULL) + return PLAYLIST_RESULT_DISABLED; + + if (!spl_valid_name(name_utf8)) + return PLAYLIST_RESULT_BAD_NAME; + path_fs = map_spl_utf8_to_fs(name_utf8); if (path_fs == NULL) - return PLAYLIST_RESULT_DISABLED; + return PLAYLIST_RESULT_BAD_NAME; ret = unlink(path_fs); g_free(path_fs); @@ -371,12 +383,15 @@ spl_append_song(const char *utf8path, struct song *song) struct stat st; char *path_fs; + if (map_spl_path() == NULL) + return PLAYLIST_RESULT_DISABLED; + if (!spl_valid_name(utf8path)) return PLAYLIST_RESULT_BAD_NAME; path_fs = map_spl_utf8_to_fs(utf8path); if (path_fs == NULL) - return PLAYLIST_RESULT_DISABLED; + return PLAYLIST_RESULT_BAD_NAME; while (!(file = fopen(path_fs, "a")) && errno == EINTR); g_free(path_fs); @@ -446,6 +461,9 @@ spl_rename(const char *utf8from, const char *utf8to) char *from_path_fs, *to_path_fs; static enum playlist_result ret; + if (map_spl_path() == NULL) + return PLAYLIST_RESULT_DISABLED; + if (!spl_valid_name(utf8from) || !spl_valid_name(utf8to)) return PLAYLIST_RESULT_BAD_NAME; @@ -455,7 +473,7 @@ spl_rename(const char *utf8from, const char *utf8to) if (from_path_fs != NULL && to_path_fs != NULL) ret = spl_rename_internal(from_path_fs, to_path_fs); else - ret = PLAYLIST_RESULT_DISABLED; + ret = PLAYLIST_RESULT_BAD_NAME; g_free(from_path_fs); g_free(to_path_fs); diff --git a/src/tag_id3.c b/src/tag_id3.c index 81a994dc7..4f1a248b3 100644 --- a/src/tag_id3.c +++ b/src/tag_id3.c @@ -96,7 +96,7 @@ import_id3_string(bool is_id3v1, const id3_ucs4_t *ucs4) utf8 = (id3_utf8_t *) g_convert_with_fallback((const char*)isostr, -1, - encoding, "utf-8", + "utf-8", encoding, NULL, NULL, NULL, NULL); if (utf8 == NULL) { g_debug("Unable to convert %s string to UTF-8: '%s'", |