- Timestamp:
- Mar 22, 2013, 2:29:19 AM (12 years ago)
- Branches:
- feature/autosink, feature/cnn, feature/cnn_org, feature/constantq, feature/crepe, feature/crepe_org, feature/pitchshift, feature/pydocstrings, feature/timestretch, fix/ffmpeg5, master, pitchshift, sampler, timestretch, yinfft+
- Children:
- ae9fd90
- Parents:
- 7982203
- Location:
- src/io
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
src/io/source.c
r7982203 r4865e4b 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 84 105 uint_t aubio_source_seek (aubio_source_t * s, uint_t seek ) { 85 106 #ifdef __APPLE__ -
src/io/source.h
r7982203 r4865e4b 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); 79 103 80 104 /** -
src/io/source_apple_audio.c
r7982203 r4865e4b 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 … … 57 58 s->path = path; 58 59 s->block_size = block_size; 59 s->channels = 1;60 60 61 61 OSStatus err = noErr; … … 83 83 s->samplerate = samplerate; 84 84 s->source_samplerate = fileFormat.mSampleRate; 85 s->channels = fileFormat.mChannelsPerFrame; 85 86 86 87 AudioStreamBasicDescription clientFormat; … … 100 101 err = ExtAudioFileSetProperty(s->audioFile, kExtAudioFileProperty_ClientDataFormat, 101 102 propSize, &clientFormat); 102 if (err) { AUBIO_ERROR("error in ExtAudioFileSetProperty, %d\n", (int)err); goto beach;}103 104 #if 0103 if (err) { 104 AUBIO_ERROR("error in ExtAudioFileSetProperty, %d\n", (int)err); 105 #if 1 105 106 // print client and format descriptions 106 107 AUBIO_DBG("Opened %s\n", s->path); … … 119 120 AUBIO_DBG("file/client Format.mReserved : %6d / %d\n", (int)fileFormat.mReserved , (int)clientFormat.mReserved); 120 121 #endif 122 goto beach; 123 } 121 124 122 125 // compute the size of the segments needed to read the input file … … 129 132 AUBIO_WRN("up-sampling %s from %0.2fHz to %0.2fHz\n", s->path, fileFormat.mSampleRate, clientFormat.mSampleRate); 130 133 } else { 131 assert ( segmentSize == samples );134 assert ( segmentSize == samples ); 132 135 //AUBIO_DBG("not resampling, segmentSize %d, block_size %d\n", segmentSize, s->block_size); 133 136 } … … 166 169 } 167 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 } 168 200 *read = (uint_t)loadedPackets; 169 201 return; … … 185 217 186 218 uint_t aubio_source_apple_audio_seek (aubio_source_apple_audio_t * s, uint_t pos) { 187 Float64 ratio = (Float64)(s->source_samplerate) / (Float64)(s->samplerate);188 OSStatus err = ExtAudioFileSeek(s->audioFile, pos);219 SInt64 resampled_pos = (SInt64)ROUND( pos * s->source_samplerate * 1. / s->samplerate ); 220 OSStatus err = ExtAudioFileSeek(s->audioFile, resampled_pos); 189 221 if (err) AUBIO_ERROR("source_apple_audio: error in ExtAudioFileSeek (%d)\n", (int)err); 190 222 return err; … … 195 227 } 196 228 229 uint_t aubio_source_apple_audio_get_channels(aubio_source_apple_audio_t * s) { 230 return s->channels; 231 } 232 197 233 #endif /* __APPLE__ */ -
src/io/source_apple_audio.h
r7982203 r4865e4b 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); 85 109 86 110 /** -
src/io/source_sndfile.c
r7982203 r4865e4b 159 159 data[j] = 0; 160 160 for (i = 0; i < input_channels; i++) { 161 data[j] += (smpl_t)s->scratch_data[input_channels*j+i];161 data[j] += s->scratch_data[input_channels*j+i]; 162 162 } 163 163 data[j] /= (smpl_t)input_channels; … … 173 173 } 174 174 175 void aubio_source_sndfile_do_multi(aubio_source_sndfile_t * s, fmat_t * read_data, uint_t * read){ 176 uint_t i,j, input_channels = s->input_channels; 177 /* do actual reading */ 178 sf_count_t read_samples = sf_read_float (s->handle, s->scratch_data, s->scratch_size); 179 180 smpl_t **data; 181 182 #ifdef HAVE_SAMPLERATE 183 if (s->ratio != 1) { 184 AUBIO_ERR("source_sndfile: no multi channel resampling yet"); 185 return; 186 data = s->input_data->data; 187 } else 188 #endif /* HAVE_SAMPLERATE */ 189 { 190 data = read_data->data; 191 } 192 193 /* de-interleaving data */ 194 for (j = 0; j < read_samples / input_channels; j++) { 195 for (i = 0; i < input_channels; i++) { 196 data[i][j] = (smpl_t)s->scratch_data[input_channels*j+i]; 197 } 198 } 199 200 #ifdef HAVE_SAMPLERATE 201 if (s->resampler) { 202 aubio_resampler_do(s->resampler, s->input_data, read_data); 203 } 204 #endif /* HAVE_SAMPLERATE */ 205 206 *read = (int)FLOOR(s->ratio * read_samples / input_channels + .5); 207 } 208 175 209 uint_t aubio_source_sndfile_get_samplerate(aubio_source_sndfile_t * s) { 176 210 return s->samplerate; 211 } 212 213 uint_t aubio_source_sndfile_get_channels(aubio_source_sndfile_t * s) { 214 return s->input_channels; 177 215 } 178 216 -
src/io/source_sndfile.h
r7982203 r4865e4b 85 85 /** 86 86 87 get number of channels of source object 88 89 \param s source object, created with ::new_aubio_source_sndfile 90 \return number of channels 91 92 */ 93 uint_t aubio_source_sndfile_get_channels (aubio_source_sndfile_t * s); 94 95 /** 96 87 97 seek source object 88 98
Note: See TracChangeset
for help on using the changeset viewer.