• Open Menu Close Menu
  • Apple
  • Shopping Bag
  • Apple
  • Mac
  • iPad
  • iPhone
  • Watch
  • TV
  • Music
  • Support
  • Search apple.com
  • Shopping Bag

Lists

Open Menu Close Menu
  • Terms and Conditions
  • Lists hosted on this site
  • Email the Postmaster
  • Tips for posting to public mailing lists
Re: Newbie problems Cocoa, objective-C using CoreAudio C libraries
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Newbie problems Cocoa, objective-C using CoreAudio C libraries


  • Subject: Re: Newbie problems Cocoa, objective-C using CoreAudio C libraries
  • From: Craig Hopson <email@hidden>
  • Date: Thu, 23 Oct 2008 16:52:02 -0600

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
  • Follow-Ups:
    • Re: Newbie problems Cocoa, objective-C using CoreAudio C libraries
      • From: "Craig Lewiston" <email@hidden>
References: 
 >Newbie problems Cocoa, objective-C using CoreAudio C libraries (From: "Craig Lewiston" <email@hidden>)
 >Re: Newbie problems Cocoa, objective-C using CoreAudio C libraries (From: John Zorko <email@hidden>)
 >Re: Newbie problems Cocoa, objective-C using CoreAudio C libraries (From: "Craig Lewiston" <email@hidden>)
 >Re: Newbie problems Cocoa, objective-C using CoreAudio C libraries (From: "Craig Lewiston" <email@hidden>)

  • Prev by Date: Re: Newbie problems Cocoa, objective-C using CoreAudio C libraries
  • Next by Date: Re: Newbie problems Cocoa, objective-C using CoreAudio C libraries
  • Previous by thread: Re: Newbie problems Cocoa, objective-C using CoreAudio C libraries
  • Next by thread: Re: Newbie problems Cocoa, objective-C using CoreAudio C libraries
  • Index(es):
    • Date
    • Thread