iOS – Использовать переменные Objective C в коде C

Я выполняю некоторые программы Core Audio в iOS и пришел к ситуации, когда мне нужно использовать переменную, которую я объявила в Objective C в некотором C обратном коде. Буферная переменная должна быть доступна как с помощью синтаксиса Objective C, так и C, но в синтаксисе C появляется сообщение об ошибке «Использование необъявленного буфера идентификатора».

Как я могу это решить? Заранее спасибо.

Пирс.

Переменная – это буфер, объявленный следующим образом в RIORecoerdingViewController.h:

@interface RIORecoerdingViewController : UIViewController <AVAudioSessionDelegate> { OSStatus status; AudioComponentInstance audioUnit; AudioStreamBasicDescription audioFormat; RIO rio; IBOutlet UIButton *button; BOOL isPlaying; Float64 graphSampleRate; NSString *destinationFilePath; CFURLRef destinationURL; ExtAudioFileRef outExtAudioFile; // New AUGraph theGraph; TPCircularBuffer buffer; } 

и я хочу использовать его в функции обратного вызова C

 static OSStatus recordingCallback(void *inRefCon, AudioUnitRenderActionFlags *ioActionFlags, const AudioTimeStamp *inTimeStamp, UInt32 inBusNumber, UInt32 inNumberFrames, AudioBufferList *ioData) { if (rio->recording) { TPCircularBufferProduceBytes(&buffer, abl.mBuffers[0].mData, inNumberFrames * 2 * sizeof(SInt32)); //&buffer has an error "Use of undeclared identifier buffer" } return noErr; } 

Это то, что аргумент void * inRefCon в вашей void * inRefCon . Когда вы настраиваете обратный вызов RemoteIO, он, вероятно, выглядит примерно так:

 AURenderCallbackStruct callbackInfo; callbackInfo.inputProc = &recordingCallback; callbackInfo.inputProcRefCon = NULL; AudioUnitSetProperty(rio, kAudioOutputUnitProperty_SetInputCallback, kAudioUnitScope_Global, 0, &callbackInfo, sizeof(callbackInfo)); 

Вы можете использовать inputProcRefCon как произвольный указатель, который станет указателем inRefCon во время вашего обратного вызова. Если вы просто хотите получить доступ к одной переменной, это легко (вы просто передаете адрес этой переменной). Например, если вам нужен ваш TPCircularBuffer:

 callbackInfo.inputProcRefCon = &buffer; 

Затем, когда вы вызываете свою recordingCallback , вы можете получить доступ к своему буферу с помощью inRefCon :

 TPCircularBuffer * bufferPtr = (TPCircularBuffer *)inRefCon; TPCircularBufferProduceBytes(bufferPtr, abl.mBuffers[0].mData, inNumberFrames * 2 * sizeof(SInt32)); 

Если вам нужен доступ к большему количеству переменных (например, эта recording логической), вы можете создать структуру и передать ее адрес.

Word на улице – это то, что вы должны избегать вызовов Objective-C в своих AURenderCallbacks (из-за служебных сообщений обмена сообщениями), но на данный момент у меня нет жестких данных, чтобы поддержать это. Вы можете передать self как inputProcRefCon , но YMMV.

Ваша переменная buffer является переменной экземпляра конкретного экземпляра RIORecoerdingViewController . Не имеет смысла использовать его без экземпляра («к какому объекту принадлежит буфер?»).

Поэтому, если у вас есть экземпляр, вы можете ссылаться на ivar как обычно (т. yourRecoerdingViewController->buffer если вы хотите перейти на маршрут указателя C).

Объект C является чистым надмножеством простой C. Он позволяет копировать указатели переменных объектов и экземпляров в стандартные переменные C, переменные параметров и структуры (и т. Д.),

Одна (считается уродливой) возможность – просто скопировать указатель буфера в глобальную переменную C (и обязательно вручную обнулить ее или не использовать при выпуске буфера). Затем обращайтесь к нему из любой точки, любой функции C.

Другие (возможно, более элегантные) возможности включают копирование указателя буфера в структуру, которую вы передаете на обратный вызов C, или передать указатель непосредственно на объект непосредственно или через элемент структуры на обратный вызов C. Затем вы можете использовать синтаксис «->» функции C в файле .m для доступа к любой переменной экземпляра любого объекта, переданного стандартной функции C, например, обратного вызова звукового блока. (Функция C должна быть объявлена ​​внутри файла .m, чтобы можно было импортировать интерфейс Objective C для определения объекта.)

Еще одна возможность, но неприемлемая для обратных вызовов звука, заключается в том, чтобы сообщение функции C (в формате .m) отображало одномоментный объект для получения / установки состояния объекта модели (включая указатели буфера).

  • Как ускорить загрузку аудиофайлов, чтобы пользователь не ожидал.
  • Ошибка возврата CMSampleBufferSetDataBufferFromAudioBufferList 12731
  • AudioFileWriteBytes занимает слишком много времени, чтобы выполнять свою работу
  • Изменение высоты звука в аудиопроигрывателе iOS, таком как Элвин и бурундуки
  • Как установить AudioChannel как левый наушник и правый наушник?
  • Ошибка -10877 при добавлении AUC-преобразователя в AUGraph
  • iPhone iOS5, какие у меня варианты для воспроизведения звука, в который я не подключаюсь?
  • Звуковые блоки IOS
  • Ошибка Obj-C: «ожидаемый неквалифицированный-id перед указателем класса»
  • искать в аудиофайле по времени
  • CoreAudio / OpenAL: как получить исходящий аудиосигнал
  • Давайте будем гением компьютера.