Ignore:
Timestamp:
Dec 19, 2018, 2:11:23 PM (11 months ago)
Author:
Paul Brossier <piem@piem.org>
Branches:
feature/autosink, feature/constantq, feature/pitchshift, feature/timestretch, master
Children:
7b5e1a5
Parents:
12e5d89
Message:

[io] source_apple_audio to use native format conversion

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/io/source_apple_audio.c

    r12e5d89 rff6d1b6  
    3434#define RT_BYTE3( a )      ( ((a) >> 16) & 0xff )
    3535#define RT_BYTE4( a )      ( ((a) >> 24) & 0xff )
    36 
    37 #define SHORT_TO_FLOAT(x) (smpl_t)(x * 3.0517578125e-05)
    3836
    3937struct _aubio_source_apple_audio_t {
     
    4947};
    5048
    51 extern int createAubioBufferList(AudioBufferList *bufferList, int channels, int max_source_samples);
     49extern int createAudioBufferList(AudioBufferList *bufferList, int channels, int max_source_samples);
    5250extern void freeAudioBufferList(AudioBufferList *bufferList);
    5351extern CFURLRef createURLFromPath(const char * path);
     
    139137
    140138  AudioStreamBasicDescription clientFormat;
    141   propSize = sizeof(clientFormat);
     139  propSize = sizeof(AudioStreamBasicDescription);
    142140  memset(&clientFormat, 0, sizeof(AudioStreamBasicDescription));
    143141  clientFormat.mFormatID         = kAudioFormatLinearPCM;
    144142  clientFormat.mSampleRate       = (Float64)(s->samplerate);
    145   clientFormat.mFormatFlags      = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked;
     143  clientFormat.mFormatFlags      = kAudioFormatFlagIsFloat;
    146144  clientFormat.mChannelsPerFrame = s->channels;
    147   clientFormat.mBitsPerChannel   = sizeof(short) * 8;
     145  clientFormat.mBitsPerChannel   = sizeof(smpl_t) * 8;
    148146  clientFormat.mFramesPerPacket  = 1;
    149147  clientFormat.mBytesPerFrame    = clientFormat.mBitsPerChannel * clientFormat.mChannelsPerFrame / 8;
    150148  clientFormat.mBytesPerPacket   = clientFormat.mFramesPerPacket * clientFormat.mBytesPerFrame;
    151   clientFormat.mReserved         = 0;
    152149
    153150  // set the client format description
     
    187184  // allocate the AudioBufferList
    188185  freeAudioBufferList(&s->bufferList);
    189   if (createAubioBufferList(&s->bufferList, s->channels, s->block_size * s->channels)) {
     186  if (createAudioBufferList(&s->bufferList, s->channels, s->block_size * s->channels)) {
    190187    AUBIO_ERR("source_apple_audio: failed creating bufferList\n");
    191188    goto beach;
     
    196193}
    197194
    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;
     195static UInt32 aubio_source_apple_audio_read_frame(aubio_source_apple_audio_t *s)
     196{
     197  UInt32 loadedPackets = s->block_size;
    200198  OSStatus err = ExtAudioFileRead(s->audioFile, &loadedPackets, &s->bufferList);
    201199  if (err) {
     
    204202        "with ExtAudioFileRead (%s)\n", s->path,
    205203        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
     208void 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;
    212213
    213214  for (v = 0; v < loadedPackets; v++) {
    214     buf[v] = 0.;
     215    read_to->data[v] = 0.;
    215216    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;
    219220  }
    220221  // short read, fill with zeros
    221222  if (loadedPackets < s->block_size) {
    222223    for (v = loadedPackets; v < s->block_size; v++) {
    223       buf[v] = 0.;
     224      read_to->data[v] = 0.;
    224225    }
    225226  }
     
    227228  *read = (uint_t)loadedPackets;
    228229  return;
    229 beach:
    230   *read = 0;
    231   return;
    232230}
    233231
    234232void 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;
    248236
    249237  for (v = 0; v < loadedPackets; v++) {
    250238    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];
    252240    }
    253241  }
     
    257245    for (v = 0; v < loadedPackets; v++) {
    258246      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)];
    260248      }
    261249    }
     
    265253    for (v = loadedPackets; v < s->block_size; v++) {
    266254      for (c = 0; c < read_to->height; c++) {
    267         buf[c][v] = 0.;
     255        read_to->data[c][v] = 0.;
    268256      }
    269257    }
    270258  }
     259
    271260  *read = (uint_t)loadedPackets;
    272   return;
    273 beach:
    274   *read = 0;
    275261  return;
    276262}
     
    323309  // after a short read, the bufferList size needs to resetted to prepare for a full read
    324310  AudioBufferList *bufferList = &s->bufferList;
    325   bufferList->mBuffers[0].mDataByteSize = s->block_size * s->channels * sizeof (short);
     311  bufferList->mBuffers[0].mDataByteSize = s->block_size * s->channels * sizeof (smpl_t);
    326312  // do the actual seek
    327313  err = ExtAudioFileSeek(s->audioFile, resampled_pos);
Note: See TracChangeset for help on using the changeset viewer.