00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include <dec_snd.h>
00023 #include <jutils.h>
00024 #include <config.h>
00025
00026 #ifdef HAVE_SNDFILE
00027
00028
00029
00030 MuseDecSndFile::MuseDecSndFile ():MuseDec (){
00031 func ("MuseDecSndFile::MuseDecSndFile()");
00032 strncpy (name, "Snd", 4);
00033 memset(&sf_info_struct, 0, sizeof(sf_info_struct));
00034 }
00035
00036 MuseDecSndFile::~MuseDecSndFile (){
00037 func ("MuseDecSndFile::~MuseSndFile()");
00038 sf_close (sf);
00039 }
00040
00041 int MuseDecSndFile::load (char *file) {
00042
00043 int res;
00044
00045
00046
00047
00048
00049
00050 if(!(sf = sf_open(file, SFM_READ, &sf_info_struct))) {
00051 warning("MuseDecSndFile:_load(): cannot open input file");
00052 return (0);
00053 }
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066 samplerate = sf_info_struct.samplerate;
00067 channels = sf_info_struct.channels;
00068 seekable = sf_info_struct.seekable ? true : false;
00069
00070 func("Opened audio file: samplerate => %d, channels => %d, seekable => %s",
00071 samplerate, channels, seekable ? "true" : "false");
00072
00073 framepos = 0;
00074
00075 if(seekable) {
00076 frametot = sf_info_struct.frames;
00077 func("Audio file is seekable: total frames: %d", frametot);
00078 res = 1;
00079 }
00080 else res = 2;
00081
00082 return (res);
00083
00084 }
00085
00086 IN_DATATYPE *MuseDecSndFile::get_audio () {
00087
00088 frames = sf_read_short(sf, snd_buffer, IN_CHUNK);
00089
00090 if(frames!=0) {
00091
00092 framepos += frames;
00093 fps = samplerate;
00094 func("MuseDecSndFile::get_audio => Frames readed: %d/%d", framepos, frametot);
00095 return ((IN_DATATYPE *) snd_buffer);
00096
00097 } else { framepos=0; eos = true; return (NULL); }
00098 }
00099
00100 bool MuseDecSndFile::seek (float pos) {
00101
00102 if(pos==0.0) {
00103
00104 framepos = 0;
00105 sf_seek(sf, 0, SEEK_SET);
00106 func("MuseDecSndFile::seek => Stop. Return to the begin of the track");
00107
00108 } else {
00109
00110 if((framepos = sf_seek(sf, (sf_count_t)(frametot * pos), SEEK_SET))==-1) {
00111 func("MuseDecSndFile::seek error");
00112 return false;
00113 }
00114 func("MuseDecSndFile::seek at position %d/%d", framepos, frametot);
00115
00116 }
00117
00118 return true;
00119 }
00120
00121 #endif