В своем приложении для iPhone я использую структуру и обращаюсь к ней из класса Objective C UIViewController. В одном из моих файлов AudioInput.h у меня есть следующее:
typedef struct
{
AudioStreamBasicDescription format;
AudioQueueRef queue;
AudioQueueBufferRef buffers[ NUM_AUDIO_BUFFERS ];
SampleBuffer samples;
bool running;
bool done;
UInt32 playPos;
} AudioRecording;
В My ViewController MainViewController.m я реализовал AudioInputCallback()
, как показано ниже:
static void AudioInputCallback(
void *userData,
AudioQueueRef queue,
AudioQueueBufferRef buffer,
const AudioTimeStamp *startTime,
UInt32 numPackets,
const AudioStreamPacketDescription *packetDescriptions
)
{
// TRACE( "AudioInputCallback\n" );
MainViewController *controller = (MainViewController *) userData;
AudioRecording *audioRecording = & controller->audioRecording;
if( audioRecording->done )
{
TRACE( "AudioInputCallback: done\n" );
return;
}
if( numPackets == 0 && audioRecording->format.mBytesPerPacket > 0 )
{
numPackets = buffer->mAudioDataByteSize / audioRecording->format.mBytesPerPacket;
}
if( numPackets == 0 )
{
TRACE( "not packets received\n" );
return;
}
const SInt16 *inSamples = (const SInt16 *) buffer->mAudioData;
const UInt32 remain = audioRecording->samples.size - audioRecording->samples.count;
if( numPackets > remain )
{
numPackets = remain;
}
if( numPackets == 0 )
{
TRACE( "AudioInputCallback: no packets received\n" );
}
if( numPackets > 0 )
{
/* Save samples. */
if( audioRecording->samples.data )
{
UInt16 *in = (UInt16 *) inSamples;
UInt16 *out = (UInt16 *)( audioRecording->samples.data + audioRecording->samples.count );
for( UInt32 i = 0; i < numPackets; ++i )
{
*out ++ = ntohs( *in++ );
}
}
audioRecording->samples.count += numPackets;
}
if( audioRecording->samples.count < audioRecording->samples.size )
{
OSStatus result = AudioQueueEnqueueBuffer( queue, buffer, 0, NULL );
if( result )
{
TRACE( "AudioQueueEnqueueBuffer(..) failed with status %d\n", result );
}
}
else
{
TRACE( "AudioInputCallback: enough material, stop recording\n" );
audioRecording->done = true;
AudioQueueStop( audioRecording->queue, true );
}
[controller performSelectorOnMainThread:@selector(bufferFilled) withObject:nil waitUntilDone:NO];
}
В этом методе в следующей строке выдает ошибку, поскольку «переменная экземпляра защищена»
MainViewController *controller = (MainViewController *) userData;
AudioRecording *audioRecording = & controller->audioRecording;
Эта ошибка возникает при запуске для iOS 5 с XCode 4.2, но тот же код выполняется без каких-либо ошибок для версии ниже iOS 5 в XCode 4.0.2.
Может кто-нибудь помочь мне, почему эта ошибка происходит? и ваши идеи для решения этой проблемы приветствуются!