• 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
Interrupt-level callbacks
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Interrupt-level callbacks


  • Subject: Interrupt-level callbacks
  • From: John Ashley Burgoyne <email@hidden>
  • Date: Wed, 2 Jun 2004 16:55:06 -0400

Dear list members,

I am writing an application based on the cross-platform PortAudio library (www.portaudio.com) to do some real-time audio processing. PortAudio handles the audio I/O through a callback (which on OS X is implemented with the AudioToolbox and CoreAudio). The PortAudio documentation states:

"Your callback function is often called by an interrupt, or low level process so you should not do any complex system activities like allocating memory, or reading or writing files, or printf(). Just crunch numbers and generate audio signals. What is safe or not safe will vary from platform to platform."

Some postings in the list archives suggest that it is unsafe to use Objective-C in any way at the interrupt level. Other places, e.g.,

http://www.stepwise.com/Articles/Technical/2001-03-20.01.html

suggest that it is safe and that the only problems are the usual ones caused by multiple threads. Does anybody know which is the case?

At the moment, a stripped version of the code looks like this:

1 @interface UPPitchDetector
2
3 - (void)setNextBuffer:(SAMPLE *)aBuffer
4 length:(unsigned long)aLong;
5
6 @end
7
8 static UPPitchDetector *instance;
9
10 static int detectorCallback(void *inputBuffer,
11 void *outputBuffer,
12 unsigned long framesPerBuffer,
13 PaTimestamp outTime,
14 void *userData)
15 {
16 [instance setNextBuffer:(SAMPLE *)inputBuffer
17 length:framesPerBuffer];
18
19 // Returning anything nonzero stops the stream.
20 return 0;
21 }
22
23 @implementation UPPitchDetector
24
25 + (UPPitchDetector *)sharedInstance
26 {
27 if (instance == nil) {
28 instance = [[UPPitchDetector alloc] init];
29 }
30 return instance;
31 }
32
33 - (id)init
34 {
35 // Initialize the UPPitchDetector.
36 }
37
38 - (void)setNextBuffer:(SAMPLE *)aBuffer
39 length:(unsigned long)aLong
40 {
41 // Process the audio data in aBuffer.
42
43 // Notify observers.
44 [[NSNotificationCenter defaultCenter]
45 postNotificationName:@"UPNewPitchNotification"
46 object:self];
47 }
48
49 @end

If it is not safe to use Objective-C, is it safe to access an object by way of an @defs() struct? There is at least one demo,

http://www.audiosynth.com/sinewavedemo.html

that does so and works. For that matter, the code posted above seems to work correctly without crashing. I'm just concerned that these instances might be unsafe but lucky.

If it is safe to use Objective-C, is it safe to use NSNotifications? If I understand correctly, the Foundation framework is thread-safe but the AppKit is not. Slightly more complicated, the purpose of the NSNotification posted in ll. 44-46--a Foundation object--is to notify an observing object of an NSOpenGLView subclass--so an object derived from AppKit--that it should update itself. Is *that* safe?

Finally, in any of these scenarios would it be necessary to qualify as volatile any declarations of instance or local method variables?

Thank you in advance for any help, and please let me know if I cut out any code that would help to clarify my questions.

Best,

Ashley Burgoyne
_______________________________________________
cocoa-dev mailing list | email@hidden
Help/Unsubscribe/Archives: http://www.lists.apple.com/mailman/listinfo/cocoa-dev
Do not post admin requests to the list. They will be ignored.


  • Follow-Ups:
    • Re: Interrupt-level callbacks
      • From: j o a r <email@hidden>
  • Prev by Date: NSSegmentedControl temporary click only?
  • Next by Date: Re: NSSegmentedControl temporary click only?
  • Previous by thread: Re: NSSegmentedControl temporary click only?
  • Next by thread: Re: Interrupt-level callbacks
  • Index(es):
    • Date
    • Thread