У меня есть кое-что действительно странное (по крайней мере, для меня, но я - нуб).Почему аргумент ioNumBytes из AudioFileReadPacketData вызывает сбой?
UInt32 numBytesReadFromFile;
OSStatus err = AudioFileReadPacketData(
audioFile, // The audio file whose audio packets you want to read.
NO, // is cache set?
&numBytesReadFromFile, // On output, the number of bytes of audio data that were read from the audio file.
(AudioStreamPacketDescription *)_packetDescriptions, // array of packet descriptions of data that was read from the audio file (for CBR null)
currentPacket, // the next packet to be read into buffer
&numPackets, // number of actually read buffers
_audioQueueBuffer->mAudioData
);
AudioFileReadPacketData считывает данные из аудиофайла и помещает его в буфер.
Итак, мой вопрос касается аргумента numBytesReadFromFile. Apple writes
numBytesReadFromFile: На выходе число байтов аудиоданных, считанных из звукового файла.
Пока все хорошо. Apple объявляет numBytesReadFromFile, как в приведенном выше примере кода, но для меня эта строка сбоев кода! Я получаю EXC BAD ACCESS.
UInt32 numBytesReadFromFile;
мне нужно объявить numBytesReadFromFile как это и все работает отлично:
UInt32 numBytesReadFromFile = 2048; // 2048 = size of my buffer
Однако это выходит из строя слишком
UInt32 numBytesReadFromFile = 12
UInt32 numBytesReadFromFile = sizeof(UInt32)
но это не
UInt32 numBytesReadFromFile = 1021; // a random number
Я нахожусь не очень опытный но насколько я знаю, я резервирую некоторую память, объявляя numBytesReadFromFile, и метод audiofilereadpacketdata записывает свои данные в адрес переменной. Пожалуйста, поправьте меня, если я ошибаюсь.
Так почему же он падает? Я думаю, что я не исправил настоящую проблему.
Мое предположение заключается в том, что у меня есть проблема многопоточности. Когда я подготовить очередь я называю AudioFileReadPacketData в главном потоке и объявить
UInt32 numBytesReadFromFile;
работает отлично. Я запускаю воспроизведение звука, и вызывается обратный вызов, который вызывает AudioFilereadPacketData во внутреннем фоновом потоке аудио очереди, и возникает ошибка, описанная выше. Если мое предположение верно, может кто-нибудь объяснить мне вопрос немного более подробно, поскольку я не испытываю многопоточности.
Спасибо.
Пожалуйста, размещайте больше кода. Что такое 'ioNumBytes' изначально? Соответствует ли ваш размер буфера? – sbooth
Больше нет кода. Все настроено для AudioFileReadDataPack. Необходимо объявить только numBytesReadFromFile, и это делается до того, как вызывается AudioFileReadDataPack. – Duc