Re: Newbie problems Cocoa, objective-C using CoreAudio C libraries
Re: Newbie problems Cocoa, objective-C using CoreAudio C libraries
- Subject: Re: Newbie problems Cocoa, objective-C using CoreAudio C libraries
- From: "Craig Lewiston" <email@hidden>
- Date: Thu, 23 Oct 2008 19:54:55 -0400
got the SpeakHerecode. This is exactly what I was looking for. :)
On Thu, Oct 23, 2008 at 7:15 PM, Daniel Elliott
<email@hidden> wrote:
> You don't have to pay to access the iphone sdk and sample code.
>
> ----- Original Message ----
> From: Craig Lewiston <email@hidden>
> To: Craig Hopson <email@hidden>
> Cc: CoreAudio list <email@hidden>
> Sent: Friday, 24 October, 2008 12:09:40 AM
> Subject: Re: Newbie problems Cocoa, objective-C using CoreAudio C libraries
>
> Can you tell me where to grab the SpeakHere code? I'm developing for
> desktop, not iPhone, so I don't have access to the SpeakHere example
> code on http://developer.apple.com/iphone/ without registering and
> having to pay $ (or at least that's what it appears).
>
>
>
>
> On Thu, Oct 23, 2008 at 6:52 PM, Craig Hopson <email@hidden> wrote:
>> John,
>>
>> I haven't taken more than a couple of seconds to look over what you have
>> submitted but nothing strikes me as being amiss, so, in the words of one
>> of
>> my CS professors long ago... If the problem isn't where you are looking,
>> look somewhere else. You should grab a copy of the SpeakHere sample code
>> and compare with what you are doing. It is a Cocoa project which plays and
>> records audio. It could be that you have not retained the object you are
>> trying to access and it has been collected out from under you.
>>
>> -Craig
>>
>>
>> On Oct 23, 2008, at 4:31 PM, Craig Lewiston wrote:
>>
>>> It looks like the problem is due to pAqData being an invalid object.
>>> I was able to isolate the error by calling
>>> AudioFileID testaudiofile = [pAqData mAudioFile];
>>> right after declaring pAqData:
>>> AQRecorderState *pAqData = (AQRecorderState *) aqData;
>>> which returned the same error from before.
>>>
>>> So, it's clear to me that I have a problem linking the incoming aqData
>>> pointer to pAqData. Could someone help me understand what is
>>> happening in that line of code? Here is the full header again to the
>>> callback function and the first line of its code:
>>>
>>> ##########
>>> static void HandleInputBuffer(
>>> void *aqData,
>>> AudioQueueRef inAQ,
>>> AudioQueueBufferRef inBuffer,
>>> const AudioTimeStamp *inStartTime,
>>> UInt32 inNumPackets,
>>> const AudioStreamPacketDescription *inPacketDesc
>>> ) {
>>>
>>> AQRecorderState *pAqData = (AQRecorderState *) aqData; //
>>> 1
>>> ##########
>>>
>>> It seems that my problem stems from not being able to access the
>>> AQRecorderState object from within the callback function. If someone
>>> could help me figure out how to access that object from within the
>>> callback function, I'd greatly appreciate.
>>>
>>> Thanks again,
>>> Craig
>>>
>>>
>>> On Thu, Oct 23, 2008 at 5:16 PM, Craig Lewiston <email@hidden>
>>> wrote:
>>>>
>>>> Thanks John. After playing around some more, I found that my code
>>>> executes, and that the callback gets called the first time, but that
>>>> it then fails at:
>>>>
>>>> AudioFileWritePackets (
>>>> [pAqData mAudioFile],
>>>> false,
>>>> inBuffer->mAudioDataByteSize,
>>>> inPacketDesc,
>>>> [pAqData mCurrentPacket],
>>>> &inNumPackets,
>>>> inBuffer->mAudioData)
>>>>
>>>> When I load it into gdb manually, I get the following error msg in gdb:
>>>>
>>>> Program received signal EXC_BAD_ACCESS, Could not access memory.
>>>> Reason: KERN_PROTECTION_FAILURE at address: 0x00000002
>>>> [Switching to process 22761 thread 0x4403]
>>>> 0xfffeff20 in objc_msgSend_rtp ()
>>>>
>>>>
>>>> I'm guessing that this error is due to the way that I am referencing
>>>> one or more of the variables in the AudioFileWritePackets() call. The
>>>> complete callback function is posted below. As you can see, I am
>>>> using the accessor methods I created, such as [pAqData mAudioFile] and
>>>> [pAqData mCurrentPacket]. However, I am still using the following
>>>> conventions: inBuffer->mAudioDataByteSize, inBuffer->mAudioData to
>>>> access the buffer being passed into the callback function. Is this
>>>> the source of my problem? Is this the correct way to address those
>>>> buffers?
>>>>
>>>> Thanks again in advance,
>>>> Craig.
>>>>
>>>>
>>>> ###########
>>>> static void HandleInputBuffer(
>>>> void *aqData,
>>>> AudioQueueRef inAQ,
>>>> AudioQueueBufferRef inBuffer,
>>>> const AudioTimeStamp *inStartTime,
>>>> UInt32 inNumPackets,
>>>> const AudioStreamPacketDescription *inPacketDesc
>>>> ) {
>>>>
>>>> AQRecorderState *pAqData = (AQRecorderState *) aqData; //
>>>> 1
>>>>
>>>> if (inNumPackets == 0 && ([pAqData DataFormatmBytesPerPacket] != 0)) {
>>>> inNumPackets = inBuffer->mAudioDataByteSize / [pAqData
>>>> DataFormatmBytesPerPacket];
>>>> }
>>>> NSLog(@"CALLBACK");
>>>> if (AudioFileWritePackets (
>>>> [pAqData mAudioFile],
>>>> false,
>>>> inBuffer->mAudioDataByteSize,
>>>> inPacketDesc,
>>>> [pAqData mCurrentPacket],
>>>> &inNumPackets,
>>>> inBuffer->mAudioData) == noErr) {
>>>> [pAqData addToCurrentPacket:inNumPackets]; // 4
>>>> }
>>>> if ([pAqData mIsRunning] == 0) {
>>>> return;
>>>> }
>>>>
>>>> AudioQueueEnqueueBuffer ([pAqData mQueue], inBuffer, 0, NULL);
>>>> }
>>>>
>>>> On Thu, Oct 23, 2008 at 4:50 PM, John Zorko <email@hidden> wrote:
>>>>>
>>>>> Craig,
>>>>> I'm a n00b as well, but i've got code working -- streaming / playing,
>>>>> not
>>>>> recording, though. Anyway, I used an ObjC class successfully instead
>>>>> of
>>>>> the
>>>>> struct. If you post some code where the problem happens, maybe I can
>>>>> help?
>>>>>
>>>>> On Oct 23, 2008, at 12:41 PM, Craig Lewiston wrote:
>>>>>
>>>>> I'm a newbie to Cocoa and CoreAudio, and have been trying to get the
>>>>> AudioQueue Record Audio example working in a Cocoa app for a few days:
>>>>>
>>>>>
>>>>> http://developer.apple.com/documentation/MusicAudio/Conceptual/AudioQueueProgrammingGuide/AQRecord/chapter_3_section_1.html
>>>>>
>>>>> I have been somewhat successful, but not completely, and I think the
>>>>> reason is due to my lack of understanding of how to use C libraries
>>>>> within an Cocoa/Objective-C application. I have a few basic questions
>>>>> I was hoping to get answered:
>>>>>
>>>>>
>>>>> 1. In the tutorial, the first step calls for creating a custom
>>>>> structure to manage the state of the audio queue. This is done in C
>>>>> with:
>>>>> struct AQRecorderState {}
>>>>>
>>>>> I initially approached this by creating a class,
>>>>> @interface AQRecorderState : NSObject {}
>>>>>
>>>>> I then wrote all the accessor methods necessary to implement the the
>>>>> class within the rest of the tutorial code. I was able to get my code
>>>>> to compile, but my program kept crashing while inside the callback
>>>>> function HandleInputBuffer(){}, specifically when executing
>>>>> AudioFileWritePackets (). I am now wondering if it is necessary to
>>>>> define a class like I did, or if it's possible to just define the
>>>>> structure in C, and use C commands to refer to the structure within my
>>>>> Obj-C code. For those of you that have used Audio Queue and
>>>>> Cocoa/Obj-C, how do you implement this -- as a C structure or an Obj-C
>>>>> class?
>>>>>
>>>>>
>>>>> 2. Trouble with callback functions. I have been declaring my callback
>>>>> function, static void HandleInputBuffer(){}, in the header file for my
>>>>> application, after the @end interface declarative. Is there a proper
>>>>> place/way to declare C callback functions in Objective-C files?
>>>>>
>>>>>
>>>>> 3. Finally, are there any working Cocoa examples implementing
>>>>> AudioQueue? I am really only looking to see how these details I
>>>>> mentioned above (structs, callbacks) are handled in Objective-C.
>>>>>
>>>>>
>>>>> Thanks in advance,
>>>>> Craig
>>>>> _______________________________________________
>>>>> Do not post admin requests to the list. They will be ignored.
>>>>> Coreaudio-api mailing list (email@hidden)
>>>>> Help/Unsubscribe/Update your Subscription:
>>>>>
>>>>> This email sent to email@hidden
>>>>>
>>>>>
>>>>> Regards,
>>>>> John
>>>>> Falling You - exploring the beauty of voice and sound
>>>>> http://www.fallingyou.com
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>
>>> _______________________________________________
>>> Do not post admin requests to the list. They will be ignored.
>>> Coreaudio-api mailing list (email@hidden)
>>> Help/Unsubscribe/Update your Subscription:
>>>
>>>
>>>
>>> This email sent to email@hidden
>>>
>>
>>
> _______________________________________________
> Do not post admin requests to the list. They will be ignored.
> Coreaudio-api mailing list (email@hidden)
> Help/Unsubscribe/Update your Subscription:
>
> This email sent to email@hidden
>
>
_______________________________________________
Do not post admin requests to the list. They will be ignored.
Coreaudio-api mailing list (email@hidden)
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden