2013-09-23 7 views
2

Через некоторое время, развиваясь с аудиоустройством, я знаю, что есть некоторая ошибка, которая хорошо известна разработчикам, которые работают со звуковыми буферами на низком уровне.Размер звукового буфера неверен на mac

Ошибка в том, что размер буфера на маке неверен и отображает 512 вместо 1024, где одно и то же программное обеспечение на iDevice показывает 1024.

Вопрос в том, есть ли способ решить это, поэтому я могу получить на Mac также 1024 бит буфера? его немного сложно работать, потому что имитация отличается от устройства.

Это функция обратного вызова, где я проверить буфер с микрофонным входа:

static OSStatus recordingCallback(void *inRefCon, 
            AudioUnitRenderActionFlags *ioActionFlags, 
            const AudioTimeStamp *inTimeStamp, 
            UInt32 inBusNumber, 
            UInt32 inNumberFrames, 
            AudioBufferList *ioData) 
{ 

    AudioBuffer buffer; 
    buffer.mNumberChannels = 1; 
    buffer.mDataByteSize = inNumberFrames * 2; 
    buffer.mData = NULL; 

    AudioBufferList bufferList; 
    bufferList.mNumberBuffers = 1; 
    bufferList.mBuffers[0] = buffer; 
    OSStatus status; 
    status = AudioUnitRender(audioUnit, 
          ioActionFlags, 
          inTimeStamp, 
          inBusNumber, 
          inNumberFrames, 
          &bufferList); 


    int16_t *q = (int16_t *)(&bufferList)->mBuffers[0].mData; 


// inNumberFrames, is 512 on a mac ,and 1024 on a device 

(выход обратного вызова динамика таким же, кстати = 512 бит).

Часть установки аудиоблоку:

AudioStreamBasicDescription audioFormat; 
audioFormat.mSampleRate   = 44100.00;//44100.00; 
audioFormat.mFormatID   = kAudioFormatLinearPCM; 
audioFormat.mFormatFlags  = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked; 
audioFormat.mFramesPerPacket = 1; 
audioFormat.mChannelsPerFrame = 1; 
audioFormat.mBitsPerChannel  = 16; 
audioFormat.mBytesPerPacket  = 2; 
audioFormat.mBytesPerFrame  = 2; 

Ну я нашел здесь, что кто-то сказать, вы должны установить на макинтош (сетчатка шахтные) частоту дискретизации в миди инструмента, я проверить но его 44100 там. chanels 24 бит, я пытался с 16 битами, но никакого хорошего результата. все еще размер буфера 512 бит на моем mac. У меня есть дисплей Retina макинтош 2012.

ответ

2

Есть несколько вещей, чтобы рассмотреть следующие вопросы: 1) аудио блоки сделаны, чтобы иметь размеры буфера, установленные хозяином 2) вы можете установить максимальную сторону буфера через переопределение AUBase :: SetMaxFramesPerSlice (nFrames) 3) Для установки минимального размера буфера нет функции.

С учетом сказанного вы можете настроить свой код так, как вы считаете нужным, переопределив все больше функций в классе AUBase. Насколько я знаю, не существует способа установить минимальный размер буфера. Что вы можете сделать, так это хранить кадры в буфере, пока не достигнете нужного номера, а затем отправьте кадры. Так же, как круговой буфер на эффект задержки.

Есть ли причина, по которой вы хотите определенное количество кадров?

+0

Я делаю тяжелый DSP на буфере, так, например, если я делаю преобразование БПФ по сигналу, разрешение отличается от 512 до 1024 выборок. и в отношении вашего ответа есть способ ограничить размер буфера во времени. но все же его патч, потому что тот же код должен запускаться на устройстве и Mac, и поскольку everyting происходит в реальном времени, я не могу манипулировать кодом, чтобы делать неприятные вещи. нет никакой причины, что размер буфера должен отличаться для mac и iDevice. там должен быть способ изменить это. – Curnelious

+0

См. Я бы сделал что-то вроде проверки inFramesToProcess, если он меньше 1024, а затем сохранит его в буфере ivar. Когда буфер ivar заполнен 1024 образцами, сделайте БПФ. Вот простой пример такого буфера: http://www.kvraudio.com/forum/viewtopic.php?t=144034 –

+0

На самом деле я пробовал это, я аккумулирую буфер, я его сохраняю, но как-то fft получает много нулей. Я думаю, что Mac работает с разрешением других образцов и другими амплитудами. – Curnelious

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