2012-01-08 2 views
3

Я создаю простое приложение для iOS, которое записывает аудио с помощью кругового буфера. Это означает, что он постоянно записывает звук, но сохраняет только последние 15 буферов в памяти.Обратный вызов служб очереди вызовов: AudioStreamPacketDescription не может быть скопирован?

Я делаю это путем копирования всех данных, я получаю от AudioInputCallback:

void AudioInputCallback(
        void *inUserData, 
        AudioQueueRef inAQ, 
        AudioQueueBufferRef inBuffer, 
        const AudioTimeStamp *inStartTime, 
        UInt32 inNumberPacketDescriptions, 
        const AudioStreamPacketDescription *inPacketDescs) 

Это прекрасно работает, и я могу записать AIF файл правильно, когда я сохранить все мои буфера в файл после того, как я остановить запись. Таким образом, копирование данных в другие буферы работает правильно.

Проблема заключается в том, что при использовании M4A, который использует переменные пакеты, эта же процедура не работает. Когда я помещаю метод AudioFileWritePackets в обратный вызов, он работает правильно, но когда я использую его после хранения буферизованных данных, он терпит неудачу.

Оказалось, что это вызвано данными const AudioStreamPacketDescription *inPacketDescs Когда я изменил это в самой функции обратного вызова (запись там) на мою копию, он немедленно сработает. Однако сами данные идентичны.

Это формат:

struct AudioStreamPacketDescription { 
    SInt64 mStartOffset; 
    UInt32 mVariableFramesInPacket; 
    UInt32 mDataByteSize; 
}; 
typedef struct AudioStreamPacketDescription AudioStreamPacketDescription; 

создать копию в моем коде, используя следующий метод:

item.inPacketDescs = (AudioStreamPacketDescription *)(malloc(sizeof(AudioStreamPacketDescription))); 

    item.inPacketDescs->mDataByteSize = inPacketDescs->mDataByteSize; 
    item.inPacketDescs->mStartOffset = inPacketDescs->mStartOffset; 
    item.inPacketDescs->mVariableFramesInPacket = inPacketDescs->mVariableFramesInPacket; 

Однако, когда затем с помощью item.inPacketDescs вместо inPacketDescs делает это не в состоянии сразу , И это, пока данные этих трех полей идентичны. (Я проверил использование отладчика).

Теперь я немного опцион. Я вижу, что поставляемая переменная равна const, поэтому я боюсь, что это имеет какую-то значимую цель, так как AudioFileWritePackets требует, чтобы это был тот же адрес памяти или так? Это было бы удивительно глупо, но я не знаю больше.

Любые идеи о том, что вызывает это? Идеи о том, как сохранить его по-другому в круговом буфере?

ответ

2

Оказывается, что inPacketDescs является array из AudioStreamPackedDescription. Поэтому копирование только первого значения не срабатывало.

Решение:

AudioStreamPacketDescription * test = (AudioStreamPacketDescription *)(malloc(inNumberPacketDescriptions * sizeof(AudioStreamPacketDescription))); 
    memcpy(test, inPacketDescs, inNumberPacketDescriptions * sizeof(AudioStreamPacketDescription)); 
+0

, как делали это работало для вас, вы все еще только обновляя тест [0] значение здесь –

+0

Не на самом деле? Я копирую размер 'inNumberPacketDescriptions' размера' AudioStreamPacketDescription', который будет более 1 из них – Peterdk

 Смежные вопросы

  • Нет связанных вопросов^_^