summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apps/playback.c50
-rw-r--r--apps/playback.h1
-rw-r--r--apps/plugins/SOURCES1
-rw-r--r--apps/tree.c1
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
78codecwav.c 78codecwav.c
79codeca52.c 79codeca52.c
80codecmpc.c 80codecmpc.c
81codecwavpack.c
81#endif 82#endif
82wv2wav.c 83wv2wav.c
83mpc2wav.c 84mpc2wav.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 },