- Timestamp:
- Dec 19, 2018, 7:31:27 PM (6 years ago)
- Branches:
- feature/cnn, feature/crepe, feature/pitchshift, feature/timestretch, fix/ffmpeg5, master
- Children:
- 0770148, cb0d7d0
- Parents:
- 34d4232 (diff), 0045668 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - Location:
- src
- Files:
-
- 14 edited
Legend:
- Unmodified
- Added
- Removed
-
src/aubio_priv.h
r34d4232 rd0f19a7 368 368 #endif /* __STRICT_ANSI__ */ 369 369 370 #if defined(DEBUG) 371 #include <assert.h> 372 #define AUBIO_ASSERT(x) assert(x) 373 #else 374 #define AUBIO_ASSERT(x) 375 #endif /* DEBUG */ 376 370 377 #endif /* AUBIO_PRIV_H */ -
src/io/ioutils.c
r34d4232 rd0f19a7 52 52 return AUBIO_OK; 53 53 } 54 55 uint_t 56 aubio_sink_validate_input_length(const char_t *kind, const char_t *path, 57 uint_t max_size, uint_t write_data_length, uint_t write) 58 { 59 uint_t can_write = write; 60 61 if (write > max_size) { 62 AUBIO_WRN("%s: partial write to %s, trying to write %d frames," 63 " at most %d can be written at once\n", kind, path, write, max_size); 64 can_write = max_size; 65 } 66 67 if (can_write > write_data_length) { 68 AUBIO_WRN("%s: partial write to %s, trying to write %d frames," 69 " but found input of length %d\n", kind, path, write, 70 write_data_length); 71 can_write = write_data_length; 72 } 73 74 return can_write; 75 } 76 77 uint_t 78 aubio_sink_validate_input_channels(const char_t *kind, const char_t *path, 79 uint_t sink_channels, uint_t write_data_height) 80 { 81 uint_t channels = sink_channels; 82 if (write_data_height < sink_channels) { 83 AUBIO_WRN("%s: partial write to %s, trying to write %d channels," 84 " but found input of height %d\n", kind, path, sink_channels, 85 write_data_height); 86 channels = write_data_height; 87 } 88 return channels; 89 } -
src/io/ioutils.h
r34d4232 rd0f19a7 54 54 uint_t channels); 55 55 56 /** validate length of input 57 58 \param kind the object kind to report on 59 \param path the path to report on 60 \param max_size maximum number of frames that can be written 61 \param write_data_length actual length of input vector/matrix 62 \param write number of samples asked 63 64 \return write or the maximum number of frames that can be written 65 */ 66 uint_t 67 aubio_sink_validate_input_length(const char_t *kind, const char_t *path, 68 uint_t max_size, uint_t write_data_length, uint_t write); 69 70 /** validate height of input 71 72 \param kind the object kind to report on 73 \param path the path to report on 74 \param max_size maximum number of channels that can be written 75 \param write_data_height actual height of input matrix 76 77 \return write_data_height or the maximum number of channels 78 */ 79 uint_t 80 aubio_sink_validate_input_channels(const char_t *kind, const char_t *path, 81 uint_t sink_channels, uint_t write_data_height); 82 56 83 #ifdef __cplusplus 57 84 } -
src/io/sink.c
r34d4232 rd0f19a7 103 103 AUBIO_ERROR("sink: failed creating '%s' at %dHz (no sink built-in)\n", uri, samplerate); 104 104 #endif 105 AUBIO_FREE(s);105 del_aubio_sink(s); 106 106 return NULL; 107 107 } … … 136 136 137 137 void del_aubio_sink(aubio_sink_t * s) { 138 if (!s) return; 139 s->s_del((void *)s->sink); 138 AUBIO_ASSERT(s); 139 if (s->s_del && s->sink) 140 s->s_del((void *)s->sink); 140 141 AUBIO_FREE(s); 141 return;142 142 } -
src/io/sink_apple_audio.c
r34d4232 rd0f19a7 32 32 #include <AudioToolbox/AudioToolbox.h> 33 33 34 #define FLOAT_TO_SHORT(x) (short)(x * 32768) 35 36 extern int createAubioBufferList(AudioBufferList *bufferList, int channels, int segmentSize); 34 extern int createAudioBufferList(AudioBufferList *bufferList, int channels, int segmentSize); 37 35 extern void freeAudioBufferList(AudioBufferList *bufferList); 38 36 extern CFURLRef createURLFromPath(const char * path); … … 62 60 s->async = false; 63 61 64 if ( (uri == NULL) || (str len(uri) < 1) ) {62 if ( (uri == NULL) || (strnlen(uri, PATH_MAX) < 1) ) { 65 63 AUBIO_ERROR("sink_apple_audio: Aborted opening null path\n"); 66 64 goto beach; 67 65 } 68 if (s->path != NULL) AUBIO_FREE(s->path); 66 69 67 s->path = AUBIO_ARRAY(char_t, strnlen(uri, PATH_MAX) + 1); 70 68 strncpy(s->path, uri, strnlen(uri, PATH_MAX) + 1); … … 77 75 return s; 78 76 } 77 79 78 // invalid samplerate given, abort 80 79 if (aubio_io_validate_samplerate("sink_apple_audio", s->path, samplerate)) { … … 92 91 return s; 93 92 beach: 94 AUBIO_FREE(s);93 del_aubio_sink_apple_audio(s); 95 94 return NULL; 96 95 } … … 103 102 s->samplerate = samplerate; 104 103 // automatically open when both samplerate and channels have been set 105 if ( s->samplerate != 0 &&s->channels != 0) {104 if (/* s->samplerate != 0 && */ s->channels != 0) { 106 105 return aubio_sink_apple_audio_open(s); 107 106 } … … 116 115 s->channels = channels; 117 116 // automatically open when both samplerate and channels have been set 118 if (s->samplerate != 0 && s->channels != 0) {117 if (s->samplerate != 0 /* && s->channels != 0 */) { 119 118 return aubio_sink_apple_audio_open(s); 120 119 } … … 151 150 CFURLRef fileURL = createURLFromPath(s->path); 152 151 bool overwrite = true; 152 153 // set the in-memory format 154 AudioStreamBasicDescription inputFormat; 155 memset(&inputFormat, 0, sizeof(AudioStreamBasicDescription)); 156 inputFormat.mFormatID = kAudioFormatLinearPCM; 157 inputFormat.mSampleRate = (Float64)(s->samplerate); 158 inputFormat.mFormatFlags = kAudioFormatFlagIsFloat | kAudioFormatFlagIsPacked; 159 inputFormat.mChannelsPerFrame = s->channels; 160 inputFormat.mBitsPerChannel = sizeof(smpl_t) * 8; 161 inputFormat.mFramesPerPacket = 1; 162 inputFormat.mBytesPerFrame = inputFormat.mBitsPerChannel * inputFormat.mChannelsPerFrame / 8; 163 inputFormat.mBytesPerPacket = inputFormat.mFramesPerPacket * inputFormat.mBytesPerFrame; 153 164 OSStatus err = noErr; 154 165 err = ExtAudioFileCreateWithURL(fileURL, fileType, &clientFormat, NULL, … … 162 173 goto beach; 163 174 } 164 if (createAubioBufferList(&s->bufferList, s->channels, s->max_frames * s->channels)) { 175 176 err = ExtAudioFileSetProperty(s->audioFile, 177 kExtAudioFileProperty_ClientDataFormat, 178 sizeof(AudioStreamBasicDescription), &inputFormat); 179 if (err) { 180 char_t errorstr[20]; 181 AUBIO_ERR("sink_apple_audio: error when trying to set output format on %s " 182 "(%s)\n", s->path, getPrintableOSStatusError(errorstr, err)); 183 goto beach; 184 } 185 186 if (createAudioBufferList(&s->bufferList, s->channels, s->max_frames * s->channels)) { 165 187 AUBIO_ERR("sink_apple_audio: error when creating buffer list for %s, " 166 188 "out of memory? \n", s->path); … … 175 197 void aubio_sink_apple_audio_do(aubio_sink_apple_audio_t * s, fvec_t * write_data, uint_t write) { 176 198 UInt32 c, v; 177 short *data = (short*)s->bufferList.mBuffers[0].mData; 178 if (write > s->max_frames) { 179 AUBIO_WRN("sink_apple_audio: trying to write %d frames, max %d\n", write, s->max_frames); 180 write = s->max_frames; 181 } 182 smpl_t *buf = write_data->data; 183 184 if (buf) { 185 for (c = 0; c < s->channels; c++) { 186 for (v = 0; v < write; v++) { 187 data[v * s->channels + c] = 188 FLOAT_TO_SHORT(buf[ v * s->channels + c]); 189 } 190 } 191 } 192 aubio_sink_apple_audio_write(s, write); 199 smpl_t *data = (smpl_t*)s->bufferList.mBuffers[0].mData; 200 uint_t length = aubio_sink_validate_input_length("sink_apple_audio", s->path, 201 s->max_frames, write_data->length, write); 202 203 for (c = 0; c < s->channels; c++) { 204 for (v = 0; v < length; v++) { 205 data[v * s->channels + c] = write_data->data[v]; 206 } 207 } 208 209 aubio_sink_apple_audio_write(s, length); 193 210 } 194 211 195 212 void aubio_sink_apple_audio_do_multi(aubio_sink_apple_audio_t * s, fmat_t * write_data, uint_t write) { 196 213 UInt32 c, v; 197 short *data = (short*)s->bufferList.mBuffers[0].mData; 198 if (write > s->max_frames) { 199 AUBIO_WRN("sink_apple_audio: trying to write %d frames, max %d\n", write, s->max_frames); 200 write = s->max_frames; 201 } 202 smpl_t **buf = write_data->data; 203 204 if (buf) { 205 for (c = 0; c < s->channels; c++) { 206 for (v = 0; v < write; v++) { 207 data[v * s->channels + c] = 208 FLOAT_TO_SHORT(buf[c][v]); 209 } 210 } 211 } 212 aubio_sink_apple_audio_write(s, write); 214 smpl_t *data = (smpl_t*)s->bufferList.mBuffers[0].mData; 215 uint_t channels = aubio_sink_validate_input_channels("sink_apple_audio", 216 s->path, s->channels, write_data->height); 217 uint_t length = aubio_sink_validate_input_length("sink_apple_audio", s->path, 218 s->max_frames, write_data->length, write); 219 220 for (c = 0; c < channels; c++) { 221 for (v = 0; v < length; v++) { 222 data[v * s->channels + c] = write_data->data[c][v]; 223 } 224 } 225 226 aubio_sink_apple_audio_write(s, length); 213 227 } 214 228 215 229 void aubio_sink_apple_audio_write(aubio_sink_apple_audio_t *s, uint_t write) { 216 230 OSStatus err = noErr; 231 // set mDataByteSize to match the number of frames to be written 232 // see https://www.mail-archive.com/coreaudio-api@lists.apple.com/msg01109.html 233 s->bufferList.mBuffers[0].mDataByteSize = write * s->channels 234 * sizeof(smpl_t); 217 235 if (s->async) { 218 236 err = ExtAudioFileWriteAsync(s->audioFile, write, &s->bufferList); … … 258 276 259 277 void del_aubio_sink_apple_audio(aubio_sink_apple_audio_t * s) { 260 if (s->audioFile) aubio_sink_apple_audio_close (s); 261 if (s->path) AUBIO_FREE(s->path); 278 AUBIO_ASSERT(s); 279 if (s->audioFile) 280 aubio_sink_apple_audio_close (s); 281 if (s->path) 282 AUBIO_FREE(s->path); 262 283 freeAudioBufferList(&s->bufferList); 263 284 AUBIO_FREE(s); 264 return;265 285 } 266 286 -
src/io/sink_sndfile.c
r34d4232 rd0f19a7 59 59 if (path == NULL) { 60 60 AUBIO_ERR("sink_sndfile: Aborted opening null path\n"); 61 return NULL; 62 } 63 64 if (s->path) AUBIO_FREE(s->path); 61 goto beach; 62 } 63 65 64 s->path = AUBIO_ARRAY(char_t, strnlen(path, PATH_MAX) + 1); 66 65 strncpy(s->path, path, strnlen(path, PATH_MAX) + 1); … … 98 97 s->samplerate = samplerate; 99 98 // automatically open when both samplerate and channels have been set 100 if ( s->samplerate != 0 &&s->channels != 0) {99 if (/* s->samplerate != 0 && */ s->channels != 0) { 101 100 return aubio_sink_sndfile_open(s); 102 101 } … … 111 110 s->channels = channels; 112 111 // automatically open when both samplerate and channels have been set 113 if (s->samplerate != 0 && s->channels != 0) {112 if (s->samplerate != 0 /* && s->channels != 0 */) { 114 113 return aubio_sink_sndfile_open(s); 115 114 } … … 148 147 /* allocate data for de/interleaving reallocated when needed. */ 149 148 if (s->scratch_size >= MAX_SIZE * AUBIO_MAX_CHANNELS) { 150 abort(); 151 AUBIO_ERR("sink_sndfile: %d x %d exceeds maximum aubio_sink_sndfile buffer size %d\n", 149 AUBIO_ERR("sink_sndfile: %d x %d exceeds maximum buffer size %d\n", 152 150 s->max_size, s->channels, MAX_SIZE * AUBIO_MAX_CHANNELS); 153 151 return AUBIO_FAIL; … … 159 157 160 158 void aubio_sink_sndfile_do(aubio_sink_sndfile_t *s, fvec_t * write_data, uint_t write){ 161 uint_t i, j, channels = s->channels; 162 int nsamples = 0; 163 smpl_t *pwrite; 159 uint_t i, j; 164 160 sf_count_t written_frames; 165 166 if (write > s->max_size) { 167 AUBIO_WRN("sink_sndfile: trying to write %d frames, but only %d can be written at a time\n", 168 write, s->max_size); 169 write = s->max_size; 170 } 171 172 nsamples = channels * write; 161 uint_t channels = s->channels; 162 uint_t length = aubio_sink_validate_input_length("sink_sndfile", s->path, 163 s->max_size, write_data->length, write); 164 int nsamples = channels * length; 173 165 174 166 /* interleaving data */ 175 167 for ( i = 0; i < channels; i++) { 176 pwrite = (smpl_t *)write_data->data; 177 for (j = 0; j < write; j++) { 178 s->scratch_data[channels*j+i] = pwrite[j]; 168 for (j = 0; j < length; j++) { 169 s->scratch_data[channels*j+i] = write_data->data[j]; 179 170 } 180 171 } … … 189 180 190 181 void aubio_sink_sndfile_do_multi(aubio_sink_sndfile_t *s, fmat_t * write_data, uint_t write){ 191 uint_t i, j, channels = s->channels; 192 int nsamples = 0; 193 smpl_t *pwrite; 182 uint_t i, j; 194 183 sf_count_t written_frames; 195 196 if (write > s->max_size) { 197 AUBIO_WRN("sink_sndfile: trying to write %d frames, but only %d can be written at a time\n", 198 write, s->max_size); 199 write = s->max_size; 200 } 201 202 nsamples = channels * write; 184 uint_t channels = aubio_sink_validate_input_channels("sink_sndfile", s->path, 185 s->channels, write_data->height); 186 uint_t length = aubio_sink_validate_input_length("sink_sndfile", s->path, 187 s->max_size, write_data->length, write); 188 int nsamples = channels * length; 203 189 204 190 /* interleaving data */ 205 for ( i = 0; i < write_data->height; i++) { 206 pwrite = (smpl_t *)write_data->data[i]; 207 for (j = 0; j < write; j++) { 208 s->scratch_data[channels*j+i] = pwrite[j]; 191 for ( i = 0; i < channels; i++) { 192 for (j = 0; j < length; j++) { 193 s->scratch_data[channels*j+i] = write_data->data[i][j]; 209 194 } 210 195 } … … 231 216 232 217 void del_aubio_sink_sndfile(aubio_sink_sndfile_t * s){ 233 if (!s) return; 234 if (s->path) AUBIO_FREE(s->path); 235 aubio_sink_sndfile_close(s); 236 AUBIO_FREE(s->scratch_data); 218 AUBIO_ASSERT(s); 219 if (s->handle) 220 aubio_sink_sndfile_close(s); 221 if (s->path) 222 AUBIO_FREE(s->path); 223 if (s->scratch_data) 224 AUBIO_FREE(s->scratch_data); 237 225 AUBIO_FREE(s); 238 226 } -
src/io/sink_wavwrite.c
r34d4232 rd0f19a7 88 88 goto beach; 89 89 } 90 if ((sint_t)samplerate < 0) { 91 AUBIO_ERR("sink_wavwrite: Can not create %s with samplerate %d\n", path, samplerate); 92 goto beach; 93 } 94 95 if (s->path) AUBIO_FREE(s->path); 90 96 91 s->path = AUBIO_ARRAY(char_t, strnlen(path, PATH_MAX) + 1); 97 92 strncpy(s->path, path, strnlen(path, PATH_MAX) + 1); … … 136 131 s->samplerate = samplerate; 137 132 // automatically open when both samplerate and channels have been set 138 if ( s->samplerate != 0 &&s->channels != 0) {133 if (/* s->samplerate != 0 && */ s->channels != 0) { 139 134 return aubio_sink_wavwrite_open(s); 140 135 } … … 149 144 s->channels = channels; 150 145 // automatically open when both samplerate and channels have been set 151 if (s->samplerate != 0 && s->channels != 0) {146 if (s->samplerate != 0 /* && s->channels != 0 */) { 152 147 return aubio_sink_wavwrite_open(s); 153 148 } … … 234 229 235 230 void aubio_sink_wavwrite_do(aubio_sink_wavwrite_t *s, fvec_t * write_data, uint_t write){ 236 uint_t i = 0, written_frames = 0; 237 238 if (write > s->max_size) { 239 AUBIO_WRN("sink_wavwrite: trying to write %d frames to %s, " 240 "but only %d can be written at a time\n", write, s->path, s->max_size); 241 write = s->max_size; 242 } 243 244 for (i = 0; i < write; i++) { 245 s->scratch_data[i] = HTOLES(FLOAT_TO_SHORT(write_data->data[i])); 246 } 247 written_frames = fwrite(s->scratch_data, 2, write, s->fid); 231 uint_t c = 0, i = 0, written_frames = 0; 232 uint_t length = aubio_sink_validate_input_length("sink_wavwrite", s->path, 233 s->max_size, write_data->length, write); 234 235 for (c = 0; c < s->channels; c++) { 236 for (i = 0; i < length; i++) { 237 s->scratch_data[i * s->channels + c] = HTOLES(FLOAT_TO_SHORT(write_data->data[i])); 238 } 239 } 240 written_frames = fwrite(s->scratch_data, 2, length * s->channels, s->fid); 248 241 249 242 if (written_frames != write) { … … 258 251 uint_t c = 0, i = 0, written_frames = 0; 259 252 260 if (write > s->max_size) { 261 AUBIO_WRN("sink_wavwrite: trying to write %d frames to %s, " 262 "but only %d can be written at a time\n", write, s->path, s->max_size); 263 write = s->max_size; 264 } 265 266 for (c = 0; c < s->channels; c++) { 267 for (i = 0; i < write; i++) { 253 uint_t channels = aubio_sink_validate_input_channels("sink_wavwrite", s->path, 254 s->channels, write_data->height); 255 uint_t length = aubio_sink_validate_input_length("sink_wavwrite", s->path, 256 s->max_size, write_data->length, write); 257 258 for (c = 0; c < channels; c++) { 259 for (i = 0; i < length; i++) { 268 260 s->scratch_data[i * s->channels + c] = HTOLES(FLOAT_TO_SHORT(write_data->data[c][i])); 269 261 } 270 262 } 271 written_frames = fwrite(s->scratch_data, 2, write* s->channels, s->fid);263 written_frames = fwrite(s->scratch_data, 2, length * s->channels, s->fid); 272 264 273 265 if (written_frames != write * s->channels) { … … 298 290 299 291 void del_aubio_sink_wavwrite(aubio_sink_wavwrite_t * s){ 300 if (!s) return; 301 aubio_sink_wavwrite_close(s); 302 if (s->path) AUBIO_FREE(s->path); 303 AUBIO_FREE(s->scratch_data); 292 AUBIO_ASSERT(s); 293 if (s->fid) 294 aubio_sink_wavwrite_close(s); 295 if (s->path) 296 AUBIO_FREE(s->path); 297 if (s->scratch_data) 298 AUBIO_FREE(s->scratch_data); 304 299 AUBIO_FREE(s); 305 300 } -
src/io/source.c
r34d4232 rd0f19a7 122 122 " (no source built-in)\n", uri, samplerate, hop_size); 123 123 #endif 124 AUBIO_FREE(s);124 del_aubio_source(s); 125 125 return NULL; 126 126 } … … 139 139 140 140 void del_aubio_source(aubio_source_t * s) { 141 if (!s) return; 142 s->s_del((void *)s->source); 141 AUBIO_ASSERT(s); 142 if (s->s_del && s->source) 143 s->s_del((void *)s->source); 143 144 AUBIO_FREE(s); 144 145 } -
src/io/source.h
r34d4232 rd0f19a7 60 60 61 61 \example io/test-source.c 62 \example io/test-source_multi.c63 62 64 63 */ -
src/io/source_apple_audio.c
r34d4232 rd0f19a7 34 34 #define RT_BYTE3( a ) ( ((a) >> 16) & 0xff ) 35 35 #define RT_BYTE4( a ) ( ((a) >> 24) & 0xff ) 36 37 #define SHORT_TO_FLOAT(x) (smpl_t)(x * 3.0517578125e-05)38 36 39 37 struct _aubio_source_apple_audio_t { … … 49 47 }; 50 48 51 extern int createAu bioBufferList(AudioBufferList *bufferList, int channels, int max_source_samples);49 extern int createAudioBufferList(AudioBufferList *bufferList, int channels, int max_source_samples); 52 50 extern void freeAudioBufferList(AudioBufferList *bufferList); 53 51 extern CFURLRef createURLFromPath(const char * path); … … 60 58 aubio_source_apple_audio_t * s = AUBIO_NEW(aubio_source_apple_audio_t); 61 59 62 if (path == NULL ) {60 if (path == NULL || strnlen(path, PATH_MAX) < 1) { 63 61 AUBIO_ERROR("source_apple_audio: Aborted opening null path\n"); 64 62 goto beach; … … 86 84 87 85 beach: 88 AUBIO_FREE(s);86 del_aubio_source_apple_audio(s); 89 87 return NULL; 90 88 } … … 95 93 UInt32 propSize; 96 94 97 if (s->path) AUBIO_FREE(s->path);98 95 s->path = AUBIO_ARRAY(char_t, strnlen(path, PATH_MAX) + 1); 99 96 strncpy(s->path, path, strnlen(path, PATH_MAX) + 1); … … 140 137 141 138 AudioStreamBasicDescription clientFormat; 142 propSize = sizeof( clientFormat);139 propSize = sizeof(AudioStreamBasicDescription); 143 140 memset(&clientFormat, 0, sizeof(AudioStreamBasicDescription)); 144 141 clientFormat.mFormatID = kAudioFormatLinearPCM; 145 142 clientFormat.mSampleRate = (Float64)(s->samplerate); 146 clientFormat.mFormatFlags = kAudioFormatFlagIs SignedInteger | kAudioFormatFlagIsPacked;143 clientFormat.mFormatFlags = kAudioFormatFlagIsFloat; 147 144 clientFormat.mChannelsPerFrame = s->channels; 148 clientFormat.mBitsPerChannel = sizeof(s hort) * 8;145 clientFormat.mBitsPerChannel = sizeof(smpl_t) * 8; 149 146 clientFormat.mFramesPerPacket = 1; 150 147 clientFormat.mBytesPerFrame = clientFormat.mBitsPerChannel * clientFormat.mChannelsPerFrame / 8; 151 148 clientFormat.mBytesPerPacket = clientFormat.mFramesPerPacket * clientFormat.mBytesPerFrame; 152 clientFormat.mReserved = 0;153 149 154 150 // set the client format description … … 188 184 // allocate the AudioBufferList 189 185 freeAudioBufferList(&s->bufferList); 190 if (createAu bioBufferList(&s->bufferList, s->channels, s->block_size * s->channels)) {186 if (createAudioBufferList(&s->bufferList, s->channels, s->block_size * s->channels)) { 191 187 AUBIO_ERR("source_apple_audio: failed creating bufferList\n"); 192 188 goto beach; … … 197 193 } 198 194 199 void aubio_source_apple_audio_do(aubio_source_apple_audio_t *s, fvec_t * read_to, uint_t * read) { 200 UInt32 c, v, loadedPackets = s->block_size; 195 static UInt32 aubio_source_apple_audio_read_frame(aubio_source_apple_audio_t *s) 196 { 197 UInt32 loadedPackets = s->block_size; 201 198 OSStatus err = ExtAudioFileRead(s->audioFile, &loadedPackets, &s->bufferList); 202 199 if (err) { … … 205 202 "with ExtAudioFileRead (%s)\n", s->path, 206 203 getPrintableOSStatusError(errorstr, err)); 207 goto beach; 208 } 209 210 short *data = (short*)s->bufferList.mBuffers[0].mData; 211 212 smpl_t *buf = read_to->data; 204 } 205 return loadedPackets; 206 } 207 208 void aubio_source_apple_audio_do(aubio_source_apple_audio_t *s, fvec_t * read_to, 209 uint_t * read) { 210 uint_t c, v; 211 UInt32 loadedPackets = aubio_source_apple_audio_read_frame(s); 212 smpl_t *data = (smpl_t*)s->bufferList.mBuffers[0].mData; 213 213 214 214 for (v = 0; v < loadedPackets; v++) { 215 buf[v] = 0.;215 read_to->data[v] = 0.; 216 216 for (c = 0; c < s->channels; c++) { 217 buf[v] += SHORT_TO_FLOAT(data[ v * s->channels + c]);218 } 219 buf[v] /= (smpl_t)s->channels;217 read_to->data[v] += data[ v * s->channels + c]; 218 } 219 read_to->data[v] /= (smpl_t)s->channels; 220 220 } 221 221 // short read, fill with zeros 222 222 if (loadedPackets < s->block_size) { 223 223 for (v = loadedPackets; v < s->block_size; v++) { 224 buf[v] = 0.;224 read_to->data[v] = 0.; 225 225 } 226 226 } … … 228 228 *read = (uint_t)loadedPackets; 229 229 return; 230 beach:231 *read = 0;232 return;233 230 } 234 231 235 232 void aubio_source_apple_audio_do_multi(aubio_source_apple_audio_t *s, fmat_t * read_to, uint_t * read) { 236 UInt32 c, v, loadedPackets = s->block_size; 237 OSStatus err = ExtAudioFileRead(s->audioFile, &loadedPackets, &s->bufferList); 238 if (err) { 239 char_t errorstr[20]; 240 AUBIO_ERROR("source_apple_audio: error while reading %s " 241 "with ExtAudioFileRead (%s)\n", s->path, 242 getPrintableOSStatusError(errorstr, err)); 243 goto beach; 244 } 245 246 short *data = (short*)s->bufferList.mBuffers[0].mData; 247 248 smpl_t **buf = read_to->data; 233 uint_t c, v; 234 UInt32 loadedPackets = aubio_source_apple_audio_read_frame(s); 235 smpl_t *data = (smpl_t*)s->bufferList.mBuffers[0].mData; 249 236 250 237 for (v = 0; v < loadedPackets; v++) { 251 238 for (c = 0; c < read_to->height; c++) { 252 buf[c][v] = SHORT_TO_FLOAT(data[ v * s->channels + c]);239 read_to->data[c][v] = data[ v * s->channels + c]; 253 240 } 254 241 } … … 258 245 for (v = 0; v < loadedPackets; v++) { 259 246 for (c = s->channels; c < read_to->height; c++) { 260 buf[c][v] = SHORT_TO_FLOAT(data[ v * s->channels + (s->channels - 1)]);247 read_to->data[c][v] = data[ v * s->channels + (s->channels - 1)]; 261 248 } 262 249 } … … 266 253 for (v = loadedPackets; v < s->block_size; v++) { 267 254 for (c = 0; c < read_to->height; c++) { 268 buf[c][v] = 0.;255 read_to->data[c][v] = 0.; 269 256 } 270 257 } 271 258 } 259 272 260 *read = (uint_t)loadedPackets; 273 return;274 beach:275 *read = 0;276 261 return; 277 262 } … … 294 279 295 280 void del_aubio_source_apple_audio(aubio_source_apple_audio_t * s){ 281 AUBIO_ASSERT(s); 296 282 aubio_source_apple_audio_close (s); 297 283 if (s->path) AUBIO_FREE(s->path); 298 284 freeAudioBufferList(&s->bufferList); 299 285 AUBIO_FREE(s); 300 return;301 286 } 302 287 … … 324 309 // after a short read, the bufferList size needs to resetted to prepare for a full read 325 310 AudioBufferList *bufferList = &s->bufferList; 326 bufferList->mBuffers[0].mDataByteSize = s->block_size * s->channels * sizeof (s hort);311 bufferList->mBuffers[0].mDataByteSize = s->block_size * s->channels * sizeof (smpl_t); 327 312 // do the actual seek 328 313 err = ExtAudioFileSeek(s->audioFile, resampled_pos); -
src/io/source_avcodec.c
r34d4232 rd0f19a7 45 45 #if LIBAVCODEC_VERSION_INT < AV_VERSION_INT(57,0,0) 46 46 #define HAVE_AUBIO_LIBAVCODEC_DEPRECATED 1 47 #endif 48 49 #if LIBAVCODEC_VERSION_INT < AV_VERSION_INT(58,3,102) 50 #define HAVE_AUBIO_LIBAVCODEC_TIMEBASE_FIX 1 47 51 #endif 48 52 … … 144 148 s->channels = 1; 145 149 146 if (s->path) AUBIO_FREE(s->path);147 150 s->path = AUBIO_ARRAY(char_t, strnlen(path, PATH_MAX) + 1); 148 151 strncpy(s->path, path, strnlen(path, PATH_MAX) + 1); … … 240 243 goto beach; 241 244 } 245 #if HAVE_AUBIO_LIBAVCODEC_TIMEBASE_FIX 246 // avoids 'skipped frames warning' with avecodec < 58, deprecated after 247 av_codec_set_pkt_timebase(avCodecCtx, 248 avFormatCtx->streams[selected_stream]->time_base); 249 #endif 242 250 #endif 243 251 … … 631 639 632 640 void del_aubio_source_avcodec(aubio_source_avcodec_t * s){ 633 if (!s) return;641 AUBIO_ASSERT(s); 634 642 aubio_source_avcodec_close(s); 635 643 if (s->output != NULL) { -
src/io/source_sndfile.c
r34d4232 rd0f19a7 87 87 s->channels = 1; 88 88 89 if (s->path) AUBIO_FREE(s->path);90 89 s->path = AUBIO_ARRAY(char_t, strnlen(path, PATH_MAX) + 1); 91 90 strncpy(s->path, path, strnlen(path, PATH_MAX) + 1); … … 332 331 333 332 void del_aubio_source_sndfile(aubio_source_sndfile_t * s){ 334 if (!s) return;333 AUBIO_ASSERT(s); 335 334 aubio_source_sndfile_close(s); 336 335 #ifdef HAVE_SAMPLERATE -
src/io/source_wavread.c
r34d4232 rd0f19a7 92 92 } 93 93 94 if (s->path) AUBIO_FREE(s->path);95 94 s->path = AUBIO_ARRAY(char_t, strnlen(path, PATH_MAX) + 1); 96 95 strncpy(s->path, path, strnlen(path, PATH_MAX) + 1); … … 472 471 473 472 void del_aubio_source_wavread(aubio_source_wavread_t * s) { 474 if (!s) return;473 AUBIO_ASSERT(s); 475 474 aubio_source_wavread_close(s); 476 475 if (s->short_output) AUBIO_FREE(s->short_output); -
src/io/utils_apple_audio.c
r34d4232 rd0f19a7 13 13 char_t *getPrintableOSStatusError(char_t *str, OSStatus error); 14 14 15 int createAubioBufferList(AudioBufferList * bufferList, int channels, int max_source_samples) { 15 int createAudioBufferList(AudioBufferList * bufferList, int channels, 16 int max_source_samples) { 16 17 bufferList->mNumberBuffers = 1; 17 18 bufferList->mBuffers[0].mNumberChannels = channels; 18 bufferList->mBuffers[0].mData = AUBIO_ARRAY(s hort, max_source_samples);19 bufferList->mBuffers[0].mDataByteSize = max_source_samples * sizeof(s hort);19 bufferList->mBuffers[0].mData = AUBIO_ARRAY(smpl_t, max_source_samples); 20 bufferList->mBuffers[0].mDataByteSize = max_source_samples * sizeof(smpl_t); 20 21 return 0; 21 22 }
Note: See TracChangeset
for help on using the changeset viewer.