Question

I've been working on this task for 12 days and i cant find any solution pleaaaaase help

i'm supposed to load about 80 m4a files and play some of them with augraph which contains mixer and remoteIO units thats how i load the files

OSStatus result;
for (int i = 0; i < [filePaths count]; i++) {
    NSMutableArray *linearr=[[NSMutableArray alloc] init];
    for (int j = 0; j < [[filePaths objectAtIndex:i] count]; j++) {
        NSString *str=[[filePaths objectAtIndex:i] objectAtIndex:j];

        CFURLRef audioFileURL = CFURLCreateFromFileSystemRepresentation (NULL, (const UInt8 *)[str cStringUsingEncoding:[NSString defaultCStringEncoding]] , strlen([str cStringUsingEncoding:[NSString defaultCStringEncoding]]), false);
        ExtAudioFileRef audiofile;
        ExtAudioFileOpenURL(audioFileURL, &audiofile);
        assert(audiofile);
        OSStatus err;
        AudioStreamBasicDescription fileFormat;
        UInt32 size = sizeof(fileFormat);
        err = ExtAudioFileGetProperty(audiofile, kExtAudioFileProperty_FileDataFormat, &size, &fileFormat);

        AudioFileID aFile;
        //size = sizeof(aFile);
        PropertySize =sizeof(PacketsToRead);
        err = ExtAudioFileGetProperty(audiofile, kExtAudioFileProperty_AudioFile, &PropertySize, &aFile);
        AudioFileTypeID fileType;
        PropertySize = sizeof(fileType);
        err = AudioFileGetProperty(aFile, kAudioFilePropertyFileFormat, &PropertySize, &fileType);
        AudioStreamBasicDescription clientFormat;
        bzero(&clientFormat, sizeof(clientFormat));
        clientFormat.mChannelsPerFrame = 2;
        clientFormat.mBytesPerFrame = 4;
        clientFormat.mBytesPerPacket = clientFormat.mBytesPerFrame;
        clientFormat.mFramesPerPacket = 1;
        clientFormat.mBitsPerChannel = 32;
        clientFormat.mFormatID = kAudioFormatLinearPCM;
        clientFormat.mSampleRate = 44100.00;
        clientFormat.mFormatFlags =kLinearPCMFormatFlagIsSignedInteger | kAudioFormatFlagIsNonInterleaved; //kLinearPCMFormatFlagIsFloat | kAudioFormatFlagIsNonInterleaved;

        err = ExtAudioFileSetProperty(audiofile, kExtAudioFileProperty_ClientDataFormat, sizeof(clientFormat), &clientFormat);

        SInt64 numFrames = 0;
        PropertySize = sizeof(numFrames);
        err = ExtAudioFileGetProperty(audiofile, kExtAudioFileProperty_FileLengthFrames, &PropertySize, &numFrames);
        NSNumber *pc = [NSNumber numberWithLongLong:numFrames];
        [[packetCount objectAtIndex:i] replaceObjectAtIndex:j withObject:pc];
        // create the buffers for reading in data
        bufferList = malloc(sizeof(AudioBufferList) + sizeof(AudioBuffer) * (clientFormat.mChannelsPerFrame - 1));
        bufferList->mNumberBuffers = clientFormat.mChannelsPerFrame;
        for (int ii=0; ii < bufferList->mNumberBuffers; ++ii) {
            bufferList->mBuffers[ii].mDataByteSize = sizeof(float) * numFrames;
            bufferList->mBuffers[ii].mNumberChannels = 2;
            bufferList->mBuffers[ii].mData = malloc(bufferList->mBuffers[ii].mDataByteSize);
        }

        UInt32 rFrames = 0;
        rFrames =(UInt32)numFrames;
        err = ExtAudioFileRead(audiofile, &rFrames, bufferList);
        [linearr addObject:[NSData dataWithBytes:bufferList->mBuffers[1].mData length:numFrames]];
        err = ExtAudioFileDispose(audiofile);

}
    [audioData addObject:linearr];
}

and that's how i play it:

UInt32 *buslist;
buslist=( UInt32*)[[[audioData objectAtIndex:0] objectAtIndex:4]bytes ];

in rendercallback func:

for (int i = 0 ; i < ioData->mNumberBuffers; i++){
     UInt32 *au3=au->mBuffers[0].mData;
     AudioBuffer buffer = ioData->mBuffers[i];
     UInt32 *frameBuffer = buffer.mData;
     for (int j = 0; j < inNumberFrames; j++)
     {
         frameBuffer[j] = buflist[counter];
         if(counter>=529200)
             counter=0;
         else
             counter++;
     }}}

Now when i play the sound i get the first part played with double speed then the second part only distortion.

Was it helpful?

Solution

I was having the exact same problem I think;

The incoming sound was at a lower sample rate, so the array I allocated wasn't big enough for the higher sample rate of the auGraph, and was too fast and short.

make sure you allocate an array to read the file something like this:

sarray->frames = totalFramesInFile * graphSampleRate / fileAudioFormat.mSampleRate;

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top