summaryrefslogtreecommitdiffstats
path: root/apps
diff options
context:
space:
mode:
authorAndree Buschmann <AndreeBuschmann@t-online.de>2011-02-15 20:00:28 +0000
committerAndree Buschmann <AndreeBuschmann@t-online.de>2011-02-15 20:00:28 +0000
commit237ca504e12c06a5cfa7cd0fb9d9c672dc588f1c (patch)
treeb6454cdfaa01c749e986386f7b3bc9fdc3a5f6c8 /apps
parent258626f4550be2e586c9e5acf20cb71ee001a8e4 (diff)
downloadrockbox-237ca504e12c06a5cfa7cd0fb9d9c672dc588f1c.tar.gz
rockbox-237ca504e12c06a5cfa7cd0fb9d9c672dc588f1c.tar.bz2
rockbox-237ca504e12c06a5cfa7cd0fb9d9c672dc588f1c.zip
All AAC-HE files will double the frame sample count, not only AAC-HE files with SBR upsampling. This change fixes issues with some m4a files reported in the forums.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@29310 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps')
-rw-r--r--apps/menus/main_menu.c2
-rw-r--r--apps/metadata/id3tags.c12
-rw-r--r--apps/metadata/metadata_common.c5
-rw-r--r--apps/metadata/mp4.c31
-rw-r--r--apps/plugins/SOURCES2
-rw-r--r--apps/plugins/test_codec.c3
-rw-r--r--apps/screens.c2
-rw-r--r--apps/talk.c12
-rw-r--r--apps/talk.h3
9 files changed, 36 insertions, 36 deletions
diff --git a/apps/menus/main_menu.c b/apps/menus/main_menu.c
index 902e14b819..6ee7ba4156 100644
--- a/apps/menus/main_menu.c
+++ b/apps/menus/main_menu.c
@@ -303,7 +303,7 @@ static int info_speak_item(int selected_item, void * data)
{
talk_id(LANG_BATTERY_TIME, false);
talk_value(battery_level(), UNIT_PERCENT, true);
- talk_value(battery_time() *60, UNIT_TIME_EXACT, true);
+ talk_value(battery_time() *60, UNIT_TIME, true);
}
else talk_id(VOICE_BLANK, false);
break;
diff --git a/apps/metadata/id3tags.c b/apps/metadata/id3tags.c
index 9ee183a1b3..9143f8ad25 100644
--- a/apps/metadata/id3tags.c
+++ b/apps/metadata/id3tags.c
@@ -358,8 +358,7 @@ static int parseuser( struct mp3entry* entry, char* tag, int bufferpos )
if ((tag - entry->id3v2buf + desc_len + 2) < bufferpos) {
/* At least part of the value was read, so we can safely try to
- * parse it
- */
+ * parse it */
value = tag + desc_len + 1;
value_len = bufferpos - (tag - entry->id3v2buf);
@@ -368,8 +367,7 @@ static int parseuser( struct mp3entry* entry, char* tag, int bufferpos )
entry->albumartist = tag;
#if CONFIG_CODEC == SWCODEC
} else {
- value_len = parse_replaygain(tag, value, entry, tag,
- value_len);
+ value_len = parse_replaygain(tag, value, entry, tag, value_len);
#endif
}
}
@@ -1040,6 +1038,12 @@ void setid3v2title(int fd, struct mp3entry *entry)
#endif
if( tr->ppFunc )
bufferpos = tr->ppFunc(entry, tag, bufferpos);
+
+ /* Trim. Take into account that multiple string contents will
+ * only be displayed up to their first null termination. All
+ * content after this null termination is obsolete and can be
+ * overwritten. */
+ bufferpos -= (bytesread - strlen(tag));
/* Seek to the next frame */
if(framelen < totframelen)
diff --git a/apps/metadata/metadata_common.c b/apps/metadata/metadata_common.c
index e1ef9a0d62..4f001775f3 100644
--- a/apps/metadata/metadata_common.c
+++ b/apps/metadata/metadata_common.c
@@ -337,7 +337,10 @@ long parse_tag(const char* name, char* value, struct mp3entry* id3,
p = NULL;
}
- if (p)
+ /* Do not overwrite already available metadata. Especially when reading
+ * tags with e.g. multiple genres / artists. This way only the first
+ * of multiple entries is used, all following are dropped. */
+ if (p!=NULL && *p==NULL)
{
len = strlen(value);
len = MIN(len, buf_remaining - 1);
diff --git a/apps/metadata/mp4.c b/apps/metadata/mp4.c
index 1ef3701e30..26ab7cc30a 100644
--- a/apps/metadata/mp4.c
+++ b/apps/metadata/mp4.c
@@ -73,9 +73,6 @@
#define MP4_udta FOURCC('u', 'd', 't', 'a')
#define MP4_extra FOURCC('-', '-', '-', '-')
-/* Used to correct id3->samples, if SBR upsampling was detected in esds atom. */
-static bool SBR_upsampling_used = false;
-
/* Read the tag data from an MP4 file, storing up to buffer_size bytes in
* buffer.
*/
@@ -120,11 +117,17 @@ static unsigned int read_mp4_tag_string(int fd, int size_left, char** buffer,
if (bytes_read)
{
- (*buffer)[bytes_read] = 0;
- *dest = *buffer;
- length = strlen(*buffer) + 1;
- *buffer_left -= length;
- *buffer += length;
+ /* Do not overwrite already available metadata. Especially when reading
+ * tags with e.g. multiple genres / artists. This way only the first
+ * of multiple entries is used, all following are dropped. */
+ if (*dest == NULL)
+ {
+ (*buffer)[bytes_read] = 0;
+ *dest = *buffer;
+ length = strlen(*buffer) + 1;
+ *buffer_left -= length;
+ *buffer += length;
+ }
}
else
{
@@ -343,11 +346,6 @@ static bool read_mp4_esds(int fd, struct mp3entry* id3, uint32_t* size)
* decoding (parts of) the file.
*/
id3->frequency *= 2;
-
- /* Set this to true to be able to calculate the correct runtime
- * and bitrate. */
- SBR_upsampling_used = true;
-
sbr = true;
}
}
@@ -640,7 +638,7 @@ static bool read_mp4_container(int fd, struct mp3entry* id3,
unsigned int i;
/* Reset to false. */
- id3->needs_upsampling_correction = true;
+ id3->needs_upsampling_correction = false;
lseek(fd, 4, SEEK_CUR);
read_uint32be(fd, &entries);
@@ -654,12 +652,12 @@ static bool read_mp4_container(int fd, struct mp3entry* id3,
read_uint32be(fd, &n);
read_uint32be(fd, &l);
- /* Some SBR files use upsampling. In this case the number
+ /* Some AAC file use HE profile. In this case the number
* of output samples is doubled to a maximum of 2048
* samples per frame. This means that files which already
* report a frame size of 2048 in their header will not
* need any further special handling. */
- if (SBR_upsampling_used && l<=1024)
+ if (id3->codectype==AFMT_MP4_AAC_HE && l<=1024)
{
id3->samples += n * l * 2;
id3->needs_upsampling_correction = true;
@@ -774,7 +772,6 @@ static bool read_mp4_container(int fd, struct mp3entry* id3,
bool get_mp4_metadata(int fd, struct mp3entry* id3)
{
- SBR_upsampling_used = false;
id3->codectype = AFMT_UNKNOWN;
id3->filesize = 0;
errno = 0;
diff --git a/apps/plugins/SOURCES b/apps/plugins/SOURCES
index 7afd97309f..4d7434d771 100644
--- a/apps/plugins/SOURCES
+++ b/apps/plugins/SOURCES
@@ -217,7 +217,7 @@ superdom.c
-#ifdef HAVE_TEST_PLUGINS /* enable in advanced build options */
+#if 1//#ifdef HAVE_TEST_PLUGINS /* enable in advanced build options */
#ifdef HAVE_ADJUSTABLE_CPU_FREQ
test_boost.c
#endif
diff --git a/apps/plugins/test_codec.c b/apps/plugins/test_codec.c
index 9b00fdbb95..56aedda1c8 100644
--- a/apps/plugins/test_codec.c
+++ b/apps/plugins/test_codec.c
@@ -883,8 +883,7 @@ menu:
boost_settings, 2, NULL);
goto menu;
}
- if(boost)
- rb->cpu_boost(true);
+ rb->cpu_boost(boost ? true: false);
#endif
if (result == QUIT)
diff --git a/apps/screens.c b/apps/screens.c
index a11c4333ea..81472e6cc7 100644
--- a/apps/screens.c
+++ b/apps/screens.c
@@ -805,7 +805,7 @@ static int runtime_speak_data(int selected_item, void* data)
talk_ids(false,
(selected_item < 2) ? LANG_RUNNING_TIME : LANG_TOP_TIME,
TALK_ID((selected_item < 2) ? global_status.runtime
- : global_status.topruntime, UNIT_TIME_EXACT));
+ : global_status.topruntime, UNIT_TIME));
return 0;
}
diff --git a/apps/talk.c b/apps/talk.c
index 5fddf85986..8c0f1f3a07 100644
--- a/apps/talk.c
+++ b/apps/talk.c
@@ -1015,7 +1015,7 @@ int talk_number(long n, bool enqueue)
/* Say time duration/interval. Input is time in seconds,
say hours,minutes,seconds. */
-static int talk_time_unit(long secs, bool exact, bool enqueue)
+static int talk_time_unit(long secs, bool enqueue)
{
int hours, mins;
if (!enqueue)
@@ -1026,11 +1026,9 @@ static int talk_time_unit(long secs, bool exact, bool enqueue)
}
if((mins = secs/60)) {
secs %= 60;
- if(exact || !hours)
- talk_value(mins, UNIT_MIN, true);
- else talk_number(mins, true); /* don't say "minutes" */
+ talk_value(mins, UNIT_MIN, true);
}
- if((exact && secs) || (!hours && !mins))
+ if((secs) || (!hours && !mins))
talk_value(secs, UNIT_SEC, true);
else if(!hours && secs)
talk_number(secs, true);
@@ -1110,8 +1108,8 @@ int talk_value_decimal(long n, int unit, int decimals, bool enqueue)
#endif
/* special case for time duration */
- if (unit == UNIT_TIME || unit == UNIT_TIME_EXACT)
- return talk_time_unit(n, unit == UNIT_TIME_EXACT, enqueue);
+ if (unit == UNIT_TIME)
+ return talk_time_unit(n, enqueue);
if (unit < 0 || unit >= UNIT_LAST)
unit_id = -1;
diff --git a/apps/talk.h b/apps/talk.h
index fc1bfe5a2d..a2a9f44e4e 100644
--- a/apps/talk.h
+++ b/apps/talk.h
@@ -50,8 +50,7 @@ enum {
UNIT_MB, /* Megabytes */
UNIT_KBIT, /* kilobits per sec */
UNIT_PM_TICK, /* peak meter units per tick */
- UNIT_TIME_EXACT,/* time duration/interval in seconds, says hours,mins,secs*/
- UNIT_TIME, /* as above but less verbose */
+ UNIT_TIME, /* time duration/interval in seconds, says hours,mins,secs */
UNIT_LAST /* END MARKER */
};