objective c - CoreAudio: the proper method of reading an AudioFileMarkerList? -


quick overview: i'm developing mac swift desktop audio application. i've run situation seems require me hit audiotoolbox c api's in order audiofilemarkerlist. there doesn't seem support in of newer avstuff, seems still need work audiotoolbox api.

so.. haven't dealt c in years , rusty proper ways manage allocation. (java programmer). while markers->mnumbermarkers has correct value of 3, can't figure out how more markers first. here 1 of the wave files i'm testing with.

i love hear experienced dealing these c structs , better, linking them swift. or, if there way retrieve markers soundfiles i'm missing - i'd love know too.

i'm concerned need release memory, unsure where/how that. since there no questions on here @ all, i'm hoping i'm not 1 having learn objective c clumsy hackery via swift. extending ezaudiofile: https://github.com/syedhali/ezaudio/blob/master/ezaudio/ezaudiofile.m

thank you!

my code is:

#import "ezaudiofileext.h"  @implementation ezaudiofileext  - (audiofilemarkerlist)markers {     // size of marker list. maybe.     uint32          propsize;      uint32          writable;      [ezaudioutilities checkresult:audiofilegetpropertyinfo( self.audiofileid,                                                            kaudiofilepropertymarkerlist,                                                            &propsize,                                                            &writable)                         operation:"failed size of marker list"];      nslog(@"propsize: %d\n", propsize );     nslog(@"audiofilemarkerlist size: %u\n", (int) sizeof( audiofilemarkerlist ) );      // don't quite why propsize 16 bytes short but... alright.     int length = (propsize + 16) / sizeof(audiofilemarkerlist);      if ( length < 1 )         length = 1;      audiofilemarkerlist markers[ length ]; // allocate enough space markers. i'm sure there more legit way     // like... not quite     //audiofilemarkerlist *markers = malloc( sizeof( audiofilemarkerlist ) * length );      nslog(@"audiofilemarkerlist length: %u\n", length );      if ( propsize > 0 ) { // seems way 'know' if have markers          // pull metadata         [ezaudioutilities checkresult:audiofilegetproperty( self.audiofileid,                                                            kaudiofilepropertymarkerlist,                                                            &propsize,                                                            &markers)                             operation:"failed markers list"];          int numreturned = sizeof(markers->mmarkers) / sizeof(markers->mmarkers[0]);          nslog(@"# of mmarkers: %d\n", numreturned );      } else {         markers->mnumbermarkers = 0; // 0 out because might have crazy talk in when uninitialized         markers->mmarkers[0].mframeposition = 0;         markers->mmarkers[0].mname = null;         markers->msmpte_timetype = 0;     }      nslog(@"# of markers: %d\n", markers->mnumbermarkers );     //nslog(@"marker 0 name: %@\n", markers.mmarkers[0].mname );       return *markers; }  @end 

here answer, in case comes across in future.

// size of markers property (dictionary) uint32          propsize; uint32          writable;  [ezaudioutilities checkresult:audiofilegetpropertyinfo( self.audiofileid,                                                        kaudiofilepropertymarkerlist,                                                        &propsize,                                                        &writable)                     operation:"failed size of marker list"];  size_t length = numbytestonumaudiofilemarkers( propsize );  // allocate enough space markers. audiofilemarkerlist markers[ length ];  if ( length > 0 ) {     // pull marker list     [ezaudioutilities checkresult:audiofilegetproperty( self.audiofileid,                                                        kaudiofilepropertymarkerlist,                                                        &propsize,                                                        &markers)                         operation:"failed markers list"];  } else {     return null; }  //nslog(@"# of markers: %d\n", markers->mnumbermarkers );