- Timestamp:
- Dec 19, 2018, 9:50:06 PM (6 years ago)
- Branches:
- feature/autosink, feature/cnn, feature/crepe, fix/ffmpeg5, master
- Children:
- 65628c4, 9630fa8
- Parents:
- eba24c59 (diff), f5adffe (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/io
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
src/io/sink_apple_audio.c
reba24c59 r5573a6b 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); … … 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)) { … … 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 s hort *data = (short*)s->bufferList.mBuffers[0].mData;199 smpl_t *data = (smpl_t*)s->bufferList.mBuffers[0].mData; 178 200 uint_t length = aubio_sink_validate_input_length("sink_apple_audio", s->path, 179 201 s->max_frames, write_data->length, write); … … 181 203 for (c = 0; c < s->channels; c++) { 182 204 for (v = 0; v < length; v++) { 183 data[v * s->channels + c] = FLOAT_TO_SHORT(write_data->data[v]);205 data[v * s->channels + c] = write_data->data[v]; 184 206 } 185 207 } … … 190 212 void aubio_sink_apple_audio_do_multi(aubio_sink_apple_audio_t * s, fmat_t * write_data, uint_t write) { 191 213 UInt32 c, v; 192 s hort *data = (short*)s->bufferList.mBuffers[0].mData;214 smpl_t *data = (smpl_t*)s->bufferList.mBuffers[0].mData; 193 215 uint_t channels = aubio_sink_validate_input_channels("sink_apple_audio", 194 216 s->path, s->channels, write_data->height); … … 198 220 for (c = 0; c < channels; c++) { 199 221 for (v = 0; v < length; v++) { 200 data[v * s->channels + c] = FLOAT_TO_SHORT(write_data->data[c][v]);222 data[v * s->channels + c] = write_data->data[c][v]; 201 223 } 202 224 } … … 207 229 void aubio_sink_apple_audio_write(aubio_sink_apple_audio_t *s, uint_t write) { 208 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); 209 235 if (s->async) { 210 236 err = ExtAudioFileWriteAsync(s->audioFile, write, &s->bufferList); -
src/io/source_apple_audio.c
reba24c59 r5573a6b 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); … … 139 137 140 138 AudioStreamBasicDescription clientFormat; 141 propSize = sizeof( clientFormat);139 propSize = sizeof(AudioStreamBasicDescription); 142 140 memset(&clientFormat, 0, sizeof(AudioStreamBasicDescription)); 143 141 clientFormat.mFormatID = kAudioFormatLinearPCM; 144 142 clientFormat.mSampleRate = (Float64)(s->samplerate); 145 clientFormat.mFormatFlags = kAudioFormatFlagIs SignedInteger | kAudioFormatFlagIsPacked;143 clientFormat.mFormatFlags = kAudioFormatFlagIsFloat; 146 144 clientFormat.mChannelsPerFrame = s->channels; 147 clientFormat.mBitsPerChannel = sizeof(s hort) * 8;145 clientFormat.mBitsPerChannel = sizeof(smpl_t) * 8; 148 146 clientFormat.mFramesPerPacket = 1; 149 147 clientFormat.mBytesPerFrame = clientFormat.mBitsPerChannel * clientFormat.mChannelsPerFrame / 8; 150 148 clientFormat.mBytesPerPacket = clientFormat.mFramesPerPacket * clientFormat.mBytesPerFrame; 151 clientFormat.mReserved = 0;152 149 153 150 // set the client format description … … 187 184 // allocate the AudioBufferList 188 185 freeAudioBufferList(&s->bufferList); 189 if (createAu bioBufferList(&s->bufferList, s->channels, s->block_size * s->channels)) {186 if (createAudioBufferList(&s->bufferList, s->channels, s->block_size * s->channels)) { 190 187 AUBIO_ERR("source_apple_audio: failed creating bufferList\n"); 191 188 goto beach; … … 196 193 } 197 194 198 void aubio_source_apple_audio_do(aubio_source_apple_audio_t *s, fvec_t * read_to, uint_t * read) { 199 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; 200 198 OSStatus err = ExtAudioFileRead(s->audioFile, &loadedPackets, &s->bufferList); 201 199 if (err) { … … 204 202 "with ExtAudioFileRead (%s)\n", s->path, 205 203 getPrintableOSStatusError(errorstr, err)); 206 goto beach; 207 } 208 209 short *data = (short*)s->bufferList.mBuffers[0].mData; 210 211 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; 212 213 213 214 for (v = 0; v < loadedPackets; v++) { 214 buf[v] = 0.;215 read_to->data[v] = 0.; 215 216 for (c = 0; c < s->channels; c++) { 216 buf[v] += SHORT_TO_FLOAT(data[ v * s->channels + c]);217 } 218 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; 219 220 } 220 221 // short read, fill with zeros 221 222 if (loadedPackets < s->block_size) { 222 223 for (v = loadedPackets; v < s->block_size; v++) { 223 buf[v] = 0.;224 read_to->data[v] = 0.; 224 225 } 225 226 } … … 227 228 *read = (uint_t)loadedPackets; 228 229 return; 229 beach:230 *read = 0;231 return;232 230 } 233 231 234 232 void aubio_source_apple_audio_do_multi(aubio_source_apple_audio_t *s, fmat_t * read_to, uint_t * read) { 235 UInt32 c, v, loadedPackets = s->block_size; 236 OSStatus err = ExtAudioFileRead(s->audioFile, &loadedPackets, &s->bufferList); 237 if (err) { 238 char_t errorstr[20]; 239 AUBIO_ERROR("source_apple_audio: error while reading %s " 240 "with ExtAudioFileRead (%s)\n", s->path, 241 getPrintableOSStatusError(errorstr, err)); 242 goto beach; 243 } 244 245 short *data = (short*)s->bufferList.mBuffers[0].mData; 246 247 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; 248 236 249 237 for (v = 0; v < loadedPackets; v++) { 250 238 for (c = 0; c < read_to->height; c++) { 251 buf[c][v] = SHORT_TO_FLOAT(data[ v * s->channels + c]);239 read_to->data[c][v] = data[ v * s->channels + c]; 252 240 } 253 241 } … … 257 245 for (v = 0; v < loadedPackets; v++) { 258 246 for (c = s->channels; c < read_to->height; c++) { 259 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)]; 260 248 } 261 249 } … … 265 253 for (v = loadedPackets; v < s->block_size; v++) { 266 254 for (c = 0; c < read_to->height; c++) { 267 buf[c][v] = 0.;255 read_to->data[c][v] = 0.; 268 256 } 269 257 } 270 258 } 259 271 260 *read = (uint_t)loadedPackets; 272 return;273 beach:274 *read = 0;275 261 return; 276 262 } … … 323 309 // after a short read, the bufferList size needs to resetted to prepare for a full read 324 310 AudioBufferList *bufferList = &s->bufferList; 325 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); 326 312 // do the actual seek 327 313 err = ExtAudioFileSeek(s->audioFile, resampled_pos); -
src/io/utils_apple_audio.c
reba24c59 r5573a6b 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.