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 );