Changes in / [6ff6d18:5d16185]
- Files:
-
- 1 added
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
src/io/source.c
r6ff6d18 r5d16185 22 22 #include "aubio_priv.h" 23 23 #include "fvec.h" 24 #include "fmat.h" 24 25 #include "io/source.h" 25 26 #ifdef __APPLE__ … … 60 61 } 61 62 63 void aubio_source_do_multi(aubio_source_t * s, fmat_t * data, uint_t * read) { 64 #ifdef __APPLE__ 65 aubio_source_apple_audio_do_multi((aubio_source_apple_audio_t *)s->source, data, read); 66 #else /* __APPLE__ */ 67 #if HAVE_SNDFILE 68 aubio_source_sndfile_do_multi((aubio_source_sndfile_t *)s->source, data, read); 69 #endif /* HAVE_SNDFILE */ 70 #endif /* __APPLE__ */ 71 } 72 62 73 void del_aubio_source(aubio_source_t * s) { 63 74 if (!s) return; … … 82 93 } 83 94 95 uint_t aubio_source_get_channels(aubio_source_t * s) { 96 #ifdef __APPLE__ 97 return aubio_source_apple_audio_get_channels((aubio_source_apple_audio_t *)s->source); 98 #else /* __APPLE__ */ 99 #if HAVE_SNDFILE 100 return aubio_source_sndfile_get_channels((aubio_source_sndfile_t *)s->source); 101 #endif /* HAVE_SNDFILE */ 102 #endif /* __APPLE__ */ 103 } 104 105 uint_t aubio_source_seek (aubio_source_t * s, uint_t seek ) { 106 #ifdef __APPLE__ 107 return aubio_source_apple_audio_seek ((aubio_source_apple_audio_t *)s->source, seek); 108 #else /* __APPLE__ */ 109 #if HAVE_SNDFILE 110 return aubio_source_sndfile_seek ((aubio_source_sndfile_t *)s->source, seek); 111 #endif /* HAVE_SNDFILE */ 112 #endif /* __APPLE__ */ 113 } -
src/io/source.h
r6ff6d18 r5d16185 70 70 /** 71 71 72 read polyphonic vector of length hop_size from source object 73 74 \param s source object, created with ::new_aubio_source 75 \param read_to ::fmat_t of data to read to 76 \param read upon returns, equals to number of frames actually read 77 78 Upon returns, `read` contains the number of frames actually read from the 79 source. `hop_size` if enough frames could be read, less otherwise. 80 81 */ 82 void aubio_source_do_multi(aubio_source_t * s, fmat_t * read_to, uint_t * read); 83 84 /** 85 72 86 get samplerate of source object 73 87 … … 77 91 */ 78 92 uint_t aubio_source_get_samplerate(aubio_source_t * s); 93 94 /** 95 96 get channels of source object 97 98 \param s source object, created with ::new_aubio_source 99 \return channels 100 101 */ 102 uint_t aubio_source_get_channels (aubio_source_t * s); 103 104 /** 105 106 seek source object 107 108 \param s source object, created with ::new_aubio_source 109 \param pos position to seek to, in frames 110 111 \return 0 if sucessful, non-zero on failure 112 113 */ 114 uint_t aubio_source_seek (aubio_source_t * s, uint_t pos); 79 115 80 116 /** -
src/io/source_apple_audio.c
r6ff6d18 r5d16185 23 23 #include "aubio_priv.h" 24 24 #include "fvec.h" 25 #include "fmat.h" 25 26 #include "io/source_apple_audio.h" 26 27 … … 37 38 struct _aubio_source_apple_audio_t { 38 39 uint_t channels; 39 uint_t samplerate; 40 uint_t samplerate; //< requested samplerate 41 uint_t source_samplerate; //< actual source samplerate 40 42 uint_t block_size; 41 43 … … 56 58 s->path = path; 57 59 s->block_size = block_size; 58 s->channels = 1;59 60 60 61 OSStatus err = noErr; … … 81 82 } 82 83 s->samplerate = samplerate; 84 s->source_samplerate = fileFormat.mSampleRate; 85 s->channels = fileFormat.mChannelsPerFrame; 83 86 84 87 AudioStreamBasicDescription clientFormat; … … 98 101 err = ExtAudioFileSetProperty(s->audioFile, kExtAudioFileProperty_ClientDataFormat, 99 102 propSize, &clientFormat); 100 if (err) { AUBIO_ERROR("error in ExtAudioFileSetProperty, %d\n", (int)err); goto beach;}101 102 #if 0103 if (err) { 104 AUBIO_ERROR("error in ExtAudioFileSetProperty, %d\n", (int)err); 105 #if 1 103 106 // print client and format descriptions 104 107 AUBIO_DBG("Opened %s\n", s->path); … … 117 120 AUBIO_DBG("file/client Format.mReserved : %6d / %d\n", (int)fileFormat.mReserved , (int)clientFormat.mReserved); 118 121 #endif 122 goto beach; 123 } 119 124 120 125 // compute the size of the segments needed to read the input file … … 127 132 AUBIO_WRN("up-sampling %s from %0.2fHz to %0.2fHz\n", s->path, fileFormat.mSampleRate, clientFormat.mSampleRate); 128 133 } else { 129 assert ( segmentSize == samples );134 assert ( segmentSize == samples ); 130 135 //AUBIO_DBG("not resampling, segmentSize %d, block_size %d\n", segmentSize, s->block_size); 131 136 } … … 144 149 UInt32 c, v, loadedPackets = s->block_size; 145 150 OSStatus err = ExtAudioFileRead(s->audioFile, &loadedPackets, &s->bufferList); 146 if (err) { AUBIO_ERROR("error in ExtAudioFileRead , %d\n", (int)err); goto beach;}151 if (err) { AUBIO_ERROR("error in ExtAudioFileRead %s %d\n", s->path, (int)err); goto beach;} 147 152 148 153 short *data = (short*)s->bufferList.mBuffers[0].mData; … … 164 169 } 165 170 171 *read = (uint_t)loadedPackets; 172 return; 173 beach: 174 *read = 0; 175 return; 176 } 177 178 void aubio_source_apple_audio_do_multi(aubio_source_apple_audio_t *s, fmat_t * read_to, uint_t * read) { 179 UInt32 c, v, loadedPackets = s->block_size; 180 OSStatus err = ExtAudioFileRead(s->audioFile, &loadedPackets, &s->bufferList); 181 if (err) { AUBIO_ERROR("source_apple_audio: error in ExtAudioFileRead, %d\n", (int)err); goto beach;} 182 183 short *data = (short*)s->bufferList.mBuffers[0].mData; 184 185 smpl_t **buf = read_to->data; 186 187 for (v = 0; v < loadedPackets; v++) { 188 for (c = 0; c < s->channels; c++) { 189 buf[c][v] = SHORT_TO_FLOAT(data[ v * s->channels + c]); 190 } 191 } 192 // short read, fill with zeros 193 if (loadedPackets < s->block_size) { 194 for (v = loadedPackets; v < s->block_size; v++) { 195 for (c = 0; c < s->channels; c++) { 196 buf[c][v] = 0.; 197 } 198 } 199 } 166 200 *read = (uint_t)loadedPackets; 167 201 return; … … 182 216 } 183 217 218 uint_t aubio_source_apple_audio_seek (aubio_source_apple_audio_t * s, uint_t pos) { 219 SInt64 resampled_pos = (SInt64)ROUND( pos * s->source_samplerate * 1. / s->samplerate ); 220 OSStatus err = ExtAudioFileSeek(s->audioFile, resampled_pos); 221 if (err) AUBIO_ERROR("source_apple_audio: error in ExtAudioFileSeek (%d)\n", (int)err); 222 return err; 223 } 224 184 225 uint_t aubio_source_apple_audio_get_samplerate(aubio_source_apple_audio_t * s) { 185 226 return s->samplerate; 186 227 } 187 228 229 uint_t aubio_source_apple_audio_get_channels(aubio_source_apple_audio_t * s) { 230 return s->channels; 231 } 232 188 233 #endif /* __APPLE__ */ -
src/io/source_apple_audio.h
r6ff6d18 r5d16185 76 76 /** 77 77 78 read polyphonic vector of length hop_size from source object 79 80 \param s source object, created with ::new_aubio_source_apple_audio 81 \param read_to ::fmat_t of data to read to 82 \param read upon returns, equals to number of frames actually read 83 84 Upon returns, `read` contains the number of frames actually read from the 85 source. `hop_size` if enough frames could be read, less otherwise. 86 87 */ 88 void aubio_source_apple_audio_do_multi(aubio_source_apple_audio_t * s, fmat_t * read_to, uint_t * read); 89 90 /** 91 78 92 get samplerate of source object 79 93 … … 83 97 */ 84 98 uint_t aubio_source_apple_audio_get_samplerate(aubio_source_apple_audio_t * s); 99 100 /** 101 102 get channels of source object 103 104 \param s source object, created with ::new_aubio_source_apple_audio 105 \return number of channels 106 107 */ 108 uint_t aubio_source_apple_audio_get_channels(aubio_source_apple_audio_t * s); 109 110 /** 111 112 seek source object 113 114 \param s source object, created with ::new_aubio_source 115 \param pos position to seek to, in frames 116 117 \return 0 if sucessful, non-zero on failure 118 119 */ 120 uint_t aubio_source_apple_audio_seek (aubio_source_apple_audio_t * s, uint_t pos); 85 121 86 122 /** -
src/io/source_sndfile.c
r6ff6d18 r5d16185 27 27 28 28 #include "aubio_priv.h" 29 #include "fvec.h" 30 #include "fmat.h" 29 31 #include "source_sndfile.h" 30 #include "fvec.h"31 32 32 33 #include "temporal/resampler.h" … … 159 160 data[j] = 0; 160 161 for (i = 0; i < input_channels; i++) { 161 data[j] += (smpl_t)s->scratch_data[input_channels*j+i];162 data[j] += s->scratch_data[input_channels*j+i]; 162 163 } 163 164 data[j] /= (smpl_t)input_channels; … … 171 172 172 173 *read = (int)FLOOR(s->ratio * read_samples / input_channels + .5); 174 175 if (*read < s->hop_size) { 176 for (j = *read; j < s->hop_size; j++) { 177 data[j] = 0; 178 } 179 } 180 181 } 182 183 void aubio_source_sndfile_do_multi(aubio_source_sndfile_t * s, fmat_t * read_data, uint_t * read){ 184 uint_t i,j, input_channels = s->input_channels; 185 /* do actual reading */ 186 sf_count_t read_samples = sf_read_float (s->handle, s->scratch_data, s->scratch_size); 187 188 smpl_t **data; 189 190 #ifdef HAVE_SAMPLERATE 191 if (s->ratio != 1) { 192 AUBIO_ERR("source_sndfile: no multi channel resampling yet"); 193 return; 194 //data = s->input_data->data; 195 } else 196 #endif /* HAVE_SAMPLERATE */ 197 { 198 data = read_data->data; 199 } 200 201 /* de-interleaving data */ 202 for (j = 0; j < read_samples / input_channels; j++) { 203 for (i = 0; i < input_channels; i++) { 204 data[i][j] = (smpl_t)s->scratch_data[input_channels*j+i]; 205 } 206 } 207 208 #ifdef HAVE_SAMPLERATE 209 if (s->resampler) { 210 //aubio_resampler_do(s->resampler, s->input_data, read_data); 211 } 212 #endif /* HAVE_SAMPLERATE */ 213 214 *read = (int)FLOOR(s->ratio * read_samples / input_channels + .5); 215 216 if (*read < s->hop_size) { 217 for (i = 0; i < input_channels; i++) { 218 for (j = *read; j < s->hop_size; j++) { 219 data[i][j] = 0.; 220 } 221 } 222 } 223 173 224 } 174 225 175 226 uint_t aubio_source_sndfile_get_samplerate(aubio_source_sndfile_t * s) { 176 227 return s->samplerate; 228 } 229 230 uint_t aubio_source_sndfile_get_channels(aubio_source_sndfile_t * s) { 231 return s->input_channels; 232 } 233 234 uint_t aubio_source_sndfile_seek (aubio_source_sndfile_t * s, uint_t pos) { 235 uint_t resampled_pos = (uint_t)ROUND(pos * s->input_samplerate * 1. / s->samplerate); 236 return sf_seek (s->handle, resampled_pos, SEEK_SET); 177 237 } 178 238 -
src/io/source_sndfile.h
r6ff6d18 r5d16185 75 75 /** 76 76 77 read polyphonic vector of length hop_size from source object 78 79 \param s source object, created with ::new_aubio_source_sndfile 80 \param read_to ::fmat_t of data to read to 81 \param read upon returns, equals to number of frames actually read 82 83 Upon returns, `read` contains the number of frames actually read from the 84 source. `hop_size` if enough frames could be read, less otherwise. 85 86 */ 87 void aubio_source_sndfile_do_multi(aubio_source_sndfile_t * s, fmat_t * read_to, uint_t * read); 88 89 /** 90 77 91 get samplerate of source object 78 92 … … 82 96 */ 83 97 uint_t aubio_source_sndfile_get_samplerate(aubio_source_sndfile_t * s); 98 99 /** 100 101 get number of channels of source object 102 103 \param s source object, created with ::new_aubio_source_sndfile 104 \return number of channels 105 106 */ 107 uint_t aubio_source_sndfile_get_channels (aubio_source_sndfile_t * s); 108 109 /** 110 111 seek source object 112 113 \param s source object, created with ::new_aubio_source_sndfile 114 \param pos position to seek to, in frames 115 116 \return 0 if sucessful, non-zero on failure 117 118 */ 119 uint_t aubio_source_sndfile_seek (aubio_source_sndfile_t *s, uint_t pos); 84 120 85 121 /** -
tests/src/io/test-source.c
r6ff6d18 r5d16185 37 37 do { 38 38 aubio_source_do(s, vec, &read); 39 //fvec_print (vec);39 fvec_print (vec); 40 40 n_frames += read; 41 41 } while ( read == hop_size );
Note: See TracChangeset
for help on using the changeset viewer.