Commit c3085d7b authored by Max Kellermann's avatar Max Kellermann

Merge branch 'v0.15.x'

Conflicts: src/decoder/ffmpeg_plugin.c
parents 179502fe 8f7bc70b
...@@ -79,6 +79,14 @@ ver 0.16 (20??/??/??) ...@@ -79,6 +79,14 @@ ver 0.16 (20??/??/??)
ver 0.15.7 (2009/??/??) 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) ver 0.15.6 (2009/11/18)
......
...@@ -311,10 +311,6 @@ ffmpeg_decode_internal(struct ffmpeg_context *ctx) ...@@ -311,10 +311,6 @@ ffmpeg_decode_internal(struct ffmpeg_context *ctx)
total_time = 0; total_time = 0;
if (codec_context->channels > 2) {
codec_context->channels = 2;
}
if (!audio_format_init_checked(&audio_format, if (!audio_format_init_checked(&audio_format,
codec_context->sample_rate, codec_context->sample_rate,
ffmpeg_sample_format(codec_context), ffmpeg_sample_format(codec_context),
......
...@@ -74,7 +74,7 @@ format_samples_int(int bytes_per_sample, void *buffer, uint32_t count) ...@@ -74,7 +74,7 @@ format_samples_int(int bytes_per_sample, void *buffer, uint32_t count)
switch (bytes_per_sample) { switch (bytes_per_sample) {
case 1: { case 1: {
uchar *dst = buffer; int8_t *dst = buffer;
/* /*
* The asserts like the following one are because we do the * The asserts like the following one are because we do the
* formatting of samples within a single buffer. The size * formatting of samples within a single buffer. The size
......
...@@ -192,14 +192,19 @@ map_spl_path(void) ...@@ -192,14 +192,19 @@ map_spl_path(void)
char * char *
map_spl_utf8_to_fs(const char *name) map_spl_utf8_to_fs(const char *name)
{ {
char *filename = g_strconcat(name, PLAYLIST_FILE_SUFFIX, NULL); char *filename_utf8, *filename_fs, *path;
char *path;
if (playlist_dir == NULL) if (playlist_dir == NULL)
return NULL; return NULL;
path = g_build_filename(playlist_dir, filename, NULL); filename_utf8 = g_strconcat(name, PLAYLIST_FILE_SUFFIX, NULL);
g_free(filename); 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; return path;
} }
...@@ -99,6 +99,8 @@ map_spl_path(void); ...@@ -99,6 +99,8 @@ map_spl_path(void);
* Maps a playlist name (without the ".m3u" suffix) to a file system * 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 * path. The return value is allocated on the heap and must be freed
* with g_free(). * with g_free().
*
* @return the path in file system encoding, or NULL if mapping failed
*/ */
char * char *
map_spl_utf8_to_fs(const char *name); map_spl_utf8_to_fs(const char *name);
......
...@@ -50,6 +50,10 @@ mixer_free(struct mixer *mixer) ...@@ -50,6 +50,10 @@ mixer_free(struct mixer *mixer)
assert(mixer->plugin != NULL); assert(mixer->plugin != NULL);
assert(mixer->mutex != 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); g_mutex_free(mixer->mutex);
mixer->plugin->finish(mixer); mixer->plugin->finish(mixer);
......
...@@ -72,12 +72,15 @@ spl_save_queue(const char *name_utf8, const struct queue *queue) ...@@ -72,12 +72,15 @@ spl_save_queue(const char *name_utf8, const struct queue *queue)
char *path_fs; char *path_fs;
FILE *file; FILE *file;
if (map_spl_path() == NULL)
return PLAYLIST_RESULT_DISABLED;
if (!spl_valid_name(name_utf8)) if (!spl_valid_name(name_utf8))
return PLAYLIST_RESULT_BAD_NAME; return PLAYLIST_RESULT_BAD_NAME;
path_fs = map_spl_utf8_to_fs(name_utf8); path_fs = map_spl_utf8_to_fs(name_utf8);
if (path_fs == NULL) if (path_fs == NULL)
return PLAYLIST_RESULT_DISABLED; return PLAYLIST_RESULT_BAD_NAME;
if (g_file_test(path_fs, G_FILE_TEST_EXISTS)) { if (g_file_test(path_fs, G_FILE_TEST_EXISTS)) {
g_free(path_fs); g_free(path_fs);
......
...@@ -153,9 +153,12 @@ spl_save(GPtrArray *list, const char *utf8path) ...@@ -153,9 +153,12 @@ spl_save(GPtrArray *list, const char *utf8path)
assert(utf8path != NULL); assert(utf8path != NULL);
if (map_spl_path() == NULL)
return PLAYLIST_RESULT_DISABLED;
path_fs = map_spl_utf8_to_fs(utf8path); path_fs = map_spl_utf8_to_fs(utf8path);
if (path_fs == NULL) if (path_fs == NULL)
return PLAYLIST_RESULT_DISABLED; return PLAYLIST_RESULT_BAD_NAME;
while (!(file = fopen(path_fs, "w")) && errno == EINTR); while (!(file = fopen(path_fs, "w")) && errno == EINTR);
g_free(path_fs); g_free(path_fs);
...@@ -179,7 +182,7 @@ spl_load(const char *utf8path) ...@@ -179,7 +182,7 @@ spl_load(const char *utf8path)
char buffer[MPD_PATH_MAX]; char buffer[MPD_PATH_MAX];
char *path_fs; char *path_fs;
if (!spl_valid_name(utf8path)) if (!spl_valid_name(utf8path) || map_spl_path() == NULL)
return NULL; return NULL;
path_fs = map_spl_utf8_to_fs(utf8path); path_fs = map_spl_utf8_to_fs(utf8path);
...@@ -300,12 +303,15 @@ spl_clear(const char *utf8path) ...@@ -300,12 +303,15 @@ spl_clear(const char *utf8path)
char *path_fs; char *path_fs;
FILE *file; FILE *file;
if (map_spl_path() == NULL)
return PLAYLIST_RESULT_DISABLED;
if (!spl_valid_name(utf8path)) if (!spl_valid_name(utf8path))
return PLAYLIST_RESULT_BAD_NAME; return PLAYLIST_RESULT_BAD_NAME;
path_fs = map_spl_utf8_to_fs(utf8path); path_fs = map_spl_utf8_to_fs(utf8path);
if (path_fs == NULL) if (path_fs == NULL)
return PLAYLIST_RESULT_DISABLED; return PLAYLIST_RESULT_BAD_NAME;
while (!(file = fopen(path_fs, "w")) && errno == EINTR); while (!(file = fopen(path_fs, "w")) && errno == EINTR);
g_free(path_fs); g_free(path_fs);
...@@ -324,9 +330,15 @@ spl_delete(const char *name_utf8) ...@@ -324,9 +330,15 @@ spl_delete(const char *name_utf8)
char *path_fs; char *path_fs;
int ret; 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); path_fs = map_spl_utf8_to_fs(name_utf8);
if (path_fs == NULL) if (path_fs == NULL)
return PLAYLIST_RESULT_DISABLED; return PLAYLIST_RESULT_BAD_NAME;
ret = unlink(path_fs); ret = unlink(path_fs);
g_free(path_fs); g_free(path_fs);
...@@ -371,12 +383,15 @@ spl_append_song(const char *utf8path, struct song *song) ...@@ -371,12 +383,15 @@ spl_append_song(const char *utf8path, struct song *song)
struct stat st; struct stat st;
char *path_fs; char *path_fs;
if (map_spl_path() == NULL)
return PLAYLIST_RESULT_DISABLED;
if (!spl_valid_name(utf8path)) if (!spl_valid_name(utf8path))
return PLAYLIST_RESULT_BAD_NAME; return PLAYLIST_RESULT_BAD_NAME;
path_fs = map_spl_utf8_to_fs(utf8path); path_fs = map_spl_utf8_to_fs(utf8path);
if (path_fs == NULL) if (path_fs == NULL)
return PLAYLIST_RESULT_DISABLED; return PLAYLIST_RESULT_BAD_NAME;
while (!(file = fopen(path_fs, "a")) && errno == EINTR); while (!(file = fopen(path_fs, "a")) && errno == EINTR);
g_free(path_fs); g_free(path_fs);
...@@ -446,6 +461,9 @@ spl_rename(const char *utf8from, const char *utf8to) ...@@ -446,6 +461,9 @@ spl_rename(const char *utf8from, const char *utf8to)
char *from_path_fs, *to_path_fs; char *from_path_fs, *to_path_fs;
static enum playlist_result ret; static enum playlist_result ret;
if (map_spl_path() == NULL)
return PLAYLIST_RESULT_DISABLED;
if (!spl_valid_name(utf8from) || !spl_valid_name(utf8to)) if (!spl_valid_name(utf8from) || !spl_valid_name(utf8to))
return PLAYLIST_RESULT_BAD_NAME; return PLAYLIST_RESULT_BAD_NAME;
...@@ -455,7 +473,7 @@ spl_rename(const char *utf8from, const char *utf8to) ...@@ -455,7 +473,7 @@ spl_rename(const char *utf8from, const char *utf8to)
if (from_path_fs != NULL && to_path_fs != NULL) if (from_path_fs != NULL && to_path_fs != NULL)
ret = spl_rename_internal(from_path_fs, to_path_fs); ret = spl_rename_internal(from_path_fs, to_path_fs);
else else
ret = PLAYLIST_RESULT_DISABLED; ret = PLAYLIST_RESULT_BAD_NAME;
g_free(from_path_fs); g_free(from_path_fs);
g_free(to_path_fs); g_free(to_path_fs);
......
...@@ -96,7 +96,7 @@ import_id3_string(bool is_id3v1, const id3_ucs4_t *ucs4) ...@@ -96,7 +96,7 @@ import_id3_string(bool is_id3v1, const id3_ucs4_t *ucs4)
utf8 = (id3_utf8_t *) utf8 = (id3_utf8_t *)
g_convert_with_fallback((const char*)isostr, -1, g_convert_with_fallback((const char*)isostr, -1,
encoding, "utf-8", "utf-8", encoding,
NULL, NULL, NULL, NULL); NULL, NULL, NULL, NULL);
if (utf8 == NULL) { if (utf8 == NULL) {
g_debug("Unable to convert %s string to UTF-8: '%s'", g_debug("Unable to convert %s string to UTF-8: '%s'",
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment