diff options
Diffstat (limited to 'apps')
-rw-r--r-- | apps/playback.c | 50 | ||||
-rw-r--r-- | apps/playback.h | 1 | ||||
-rw-r--r-- | apps/plugins/SOURCES | 1 | ||||
-rw-r--r-- | apps/tree.c | 1 |
4 files changed, 52 insertions, 1 deletions
diff --git a/apps/playback.c b/apps/playback.c index 5454fd0e31..c91a3a8155 100644 --- a/apps/playback.c +++ b/apps/playback.c | |||
@@ -68,6 +68,7 @@ static volatile bool paused; | |||
68 | #define CODEC_WAV "/.rockbox/codecs/codecwav.rock"; | 68 | #define CODEC_WAV "/.rockbox/codecs/codecwav.rock"; |
69 | #define CODEC_A52 "/.rockbox/codecs/codeca52.rock"; | 69 | #define CODEC_A52 "/.rockbox/codecs/codeca52.rock"; |
70 | #define CODEC_MPC "/.rockbox/codecs/codecmpc.rock"; | 70 | #define CODEC_MPC "/.rockbox/codecs/codecmpc.rock"; |
71 | #define CODEC_WAVPACK "/.rockbox/codecs/codecwavpack.rock"; | ||
71 | 72 | ||
72 | #define AUDIO_DEFAULT_WATERMARK (1024*256) | 73 | #define AUDIO_DEFAULT_WATERMARK (1024*256) |
73 | #define AUDIO_DEFAULT_FILECHUNK (1024*32) | 74 | #define AUDIO_DEFAULT_FILECHUNK (1024*32) |
@@ -417,6 +418,8 @@ int probe_file_format(const char *filename) | |||
417 | return AFMT_A52; | 418 | return AFMT_A52; |
418 | else if (!strcasecmp("rm", suffix)) | 419 | else if (!strcasecmp("rm", suffix)) |
419 | return AFMT_REAL; | 420 | return AFMT_REAL; |
421 | else if (!strcasecmp("wv", suffix)) | ||
422 | return AFMT_WAVPACK; | ||
420 | 423 | ||
421 | return AFMT_UNKNOWN; | 424 | return AFMT_UNKNOWN; |
422 | 425 | ||
@@ -521,6 +524,10 @@ bool loadcodec(const char *trackname, bool start_play) | |||
521 | logf("Codec: Musepack"); | 524 | logf("Codec: Musepack"); |
522 | codec_path = CODEC_MPC; | 525 | codec_path = CODEC_MPC; |
523 | break; | 526 | break; |
527 | case AFMT_WAVPACK: | ||
528 | logf("Codec: WAVPACK"); | ||
529 | codec_path = CODEC_WAVPACK; | ||
530 | break; | ||
524 | default: | 531 | default: |
525 | logf("Codec: Unsupported"); | 532 | logf("Codec: Unsupported"); |
526 | snprintf(msgbuf, sizeof(msgbuf)-1, "No codec for: %s", trackname); | 533 | snprintf(msgbuf, sizeof(msgbuf)-1, "No codec for: %s", trackname); |
@@ -735,7 +742,6 @@ bool audio_load_track(int offset, bool start_play, int peek_offset) | |||
735 | tracks[track_widx].taginfo_ready = true; | 742 | tracks[track_widx].taginfo_ready = true; |
736 | 743 | ||
737 | break; | 744 | break; |
738 | |||
739 | 745 | ||
740 | case AFMT_FLAC: | 746 | case AFMT_FLAC: |
741 | /* A simple parser to read vital metadata from a FLAC file - length, frequency, bitrate etc. */ | 747 | /* A simple parser to read vital metadata from a FLAC file - length, frequency, bitrate etc. */ |
@@ -886,6 +892,48 @@ bool audio_load_track(int offset, bool start_play, int peek_offset) | |||
886 | tracks[track_widx].taginfo_ready = true; | 892 | tracks[track_widx].taginfo_ready = true; |
887 | break; | 893 | break; |
888 | 894 | ||
895 | case AFMT_WAVPACK: | ||
896 | /* A simple parser to read basic information from a WavPack file. | ||
897 | * This will fail on WavPack files that don't have the WavPack header | ||
898 | * as the first thing (i.e. self-extracting WavPack files) or WavPack | ||
899 | * files that have so much extra RIFF data stored in the first block | ||
900 | * that they don't have samples (very rare, I would think). | ||
901 | */ | ||
902 | |||
903 | /* Use the trackname part of the id3 structure as a temporary buffer */ | ||
904 | buf=tracks[track_widx].id3.path; | ||
905 | |||
906 | lseek(fd, 0, SEEK_SET); | ||
907 | |||
908 | rc = read(fd, buf, 32); | ||
909 | if (rc < 32) { | ||
910 | close(fd); | ||
911 | return false; | ||
912 | } | ||
913 | |||
914 | if (memcmp (buf, "wvpk", 4) != 0 || buf [9] != 4 || buf [8] < 2) { | ||
915 | logf ("%s is not a WavPack file\n", trackname); | ||
916 | close (fd); | ||
917 | return (false); | ||
918 | } | ||
919 | |||
920 | tracks[track_widx].id3.vbr = true; /* All WavPack files are VBR */ | ||
921 | tracks[track_widx].id3.filesize = filesize (fd); | ||
922 | tracks[track_widx].id3.frequency = 44100; | ||
923 | |||
924 | if ((buf [20] | buf [21] | buf [22] | buf [23]) && | ||
925 | (buf [12] & buf [13] & buf [14] & buf [15]) != 0xff) { | ||
926 | totalsamples = (buf[15] << 24) | (buf[14] << 16) | (buf[13] << 8) | buf[12]; | ||
927 | tracks[track_widx].id3.length = (totalsamples + 220) / 441 * 10; | ||
928 | tracks[track_widx].id3.bitrate = filesize (fd) / | ||
929 | (tracks[track_widx].id3.length / 8); | ||
930 | } | ||
931 | |||
932 | lseek (fd, 0, SEEK_SET); | ||
933 | strncpy (tracks[track_widx].id3.path, trackname, sizeof (tracks[track_widx].id3.path)); | ||
934 | tracks[track_widx].taginfo_ready = true; | ||
935 | break; | ||
936 | |||
889 | /* If we don't know how to read the metadata, just store the filename */ | 937 | /* If we don't know how to read the metadata, just store the filename */ |
890 | default: | 938 | default: |
891 | strncpy(tracks[track_widx].id3.path,trackname,sizeof(tracks[track_widx].id3.path)); | 939 | strncpy(tracks[track_widx].id3.path,trackname,sizeof(tracks[track_widx].id3.path)); |
diff --git a/apps/playback.h b/apps/playback.h index c9668bd9a2..18f92488fa 100644 --- a/apps/playback.h +++ b/apps/playback.h | |||
@@ -34,6 +34,7 @@ | |||
34 | #define AFMT_A52 0x0400 // A/52 (aka AC3) audio | 34 | #define AFMT_A52 0x0400 // A/52 (aka AC3) audio |
35 | #define AFMT_REAL 0x0800 // Realaudio | 35 | #define AFMT_REAL 0x0800 // Realaudio |
36 | #define AFMT_UNKNOWN 0x1000 // Unknown file format | 36 | #define AFMT_UNKNOWN 0x1000 // Unknown file format |
37 | #define AFMT_WAVPACK 0x2000 // WavPack | ||
37 | 38 | ||
38 | #define CODEC_SET_FILEBUF_WATERMARK 1 | 39 | #define CODEC_SET_FILEBUF_WATERMARK 1 |
39 | #define CODEC_SET_FILEBUF_CHUNKSIZE 2 | 40 | #define CODEC_SET_FILEBUF_CHUNKSIZE 2 |
diff --git a/apps/plugins/SOURCES b/apps/plugins/SOURCES index 7131f8329e..34f014d9d6 100644 --- a/apps/plugins/SOURCES +++ b/apps/plugins/SOURCES | |||
@@ -78,6 +78,7 @@ codecflac.c | |||
78 | codecwav.c | 78 | codecwav.c |
79 | codeca52.c | 79 | codeca52.c |
80 | codecmpc.c | 80 | codecmpc.c |
81 | codecwavpack.c | ||
81 | #endif | 82 | #endif |
82 | wv2wav.c | 83 | wv2wav.c |
83 | mpc2wav.c | 84 | mpc2wav.c |
diff --git a/apps/tree.c b/apps/tree.c index cd034fe590..652a4e5235 100644 --- a/apps/tree.c +++ b/apps/tree.c | |||
@@ -80,6 +80,7 @@ const struct filetype filetypes[] = { | |||
80 | { ".ac3", TREE_ATTR_MPA, File, VOICE_EXT_MPA }, | 80 | { ".ac3", TREE_ATTR_MPA, File, VOICE_EXT_MPA }, |
81 | { ".a52", TREE_ATTR_MPA, File, VOICE_EXT_MPA }, | 81 | { ".a52", TREE_ATTR_MPA, File, VOICE_EXT_MPA }, |
82 | { ".mpc", TREE_ATTR_MPA, File, VOICE_EXT_MPA }, | 82 | { ".mpc", TREE_ATTR_MPA, File, VOICE_EXT_MPA }, |
83 | { ".wv", TREE_ATTR_MPA, File, VOICE_EXT_MPA }, | ||
83 | #endif | 84 | #endif |
84 | { ".m3u", TREE_ATTR_M3U, Playlist, LANG_PLAYLIST }, | 85 | { ".m3u", TREE_ATTR_M3U, Playlist, LANG_PLAYLIST }, |
85 | { ".cfg", TREE_ATTR_CFG, Config, VOICE_EXT_CFG }, | 86 | { ".cfg", TREE_ATTR_CFG, Config, VOICE_EXT_CFG }, |