Я создаю простое приложение для 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
требует, чтобы это был тот же адрес памяти или так? Это было бы удивительно глупо, но я не знаю больше.
Любые идеи о том, что вызывает это? Идеи о том, как сохранить его по-другому в круговом буфере?
, как делали это работало для вас, вы все еще только обновляя тест [0] значение здесь –
Не на самом деле? Я копирую размер 'inNumberPacketDescriptions' размера' AudioStreamPacketDescription', который будет более 1 из них – Peterdk