Thank you very much for taking your time to share your experience!

2015-01-15 21:11 GMT+02:00 Christian Rober <[email protected]>:

> Reply Inline:
>
> On Thu, Jan 15, 2015 at 1:15 PM, Nick <[email protected]> wrote:
> > Hi Christian,
> > Thanks for the reply.
> >
> > Yes, I had found the functions
> >
> > AUBase::CallHostMusicalTimeLocation
> >
> > AUBase::CallHostBeatAndTempo
> >
> > AUBase::CallHostTransportState
> >
> > What I meant in my question however - is there a way to get
> > callbacks/notifications invoked in my Audio Unit every time when beat/bar
> > changes, or when the host playback starts/stops (for instance, when the
> user
> > clicks the Play button in MainStage). Or do I have to implement tracking
> of
> > these events manually in my render function by checking if and how the
> beat
> > value changed?
>
> Yes, I believe you have to track the events yourself.  This is what I
> have done in my work.
>
> >
> > Manual tracking sounds like a tedious work though. For instance, I would
> > like to have a function called every time a metronome ticks (i.e., a beat
> > changes).
>
> That would be handy.  Though I think the API is designed around
> performing these calculations on the real-time audio thread only, and
> in a very predictable order.
>
> I think the moment before you render, on the audio thread, is the only
> place you could get an accurate reading of the current host position
> for your processing.  If you did have an API for other function
> callbacks, it isn't clear to me on what other thread, and in what
> order, those functions would be called.  If the calls are on any
> thread other than the audio thread processing your samples (ex: UI,
> background, etc.) then I think there are no guarantees as to when the
> host calls this function to alert you, with respect to the audio
> thread.
>
> In other words, if such an API existed, the musical data you are
> asking for would probably be stale by the time it reached you. Worse,
> it wouldn't even be stale by the same amount each time.
>
> >
> > CallHostBeatAndTempo returns fractional value, so what I can do - is in
> the
> > AU's Render() function trunc the Float64 beat value and compare it with a
> > trunced previous value, if it changed, then beat happened and I ought to
> > invoke my Beat() function. However host's (int)beat value can change not
> > only when the metronome ticks, but when the user presses the play button
> (it
> > was 0 before Play was pressed, then it jumps to 21.768750 (why?), then
> jumps
> > again to 0 and starts increasing normally every metronome tick by 1). So
> > when the user presses play, the Beat() function is invoked twice, even
> > though the metronome ticked only once. Weird.
>
> I too have seen lots of strange behavior from hosts using this API.  I
> have learned to use as many of the parameters to these different
> callbacks as I need to determine "the truth" about the current host
> state.  For example, the current global sample position (I forget the
> output parameter name) is really useful because it is
> integral/discrete, unlike beat output parameters which can be
> fractional.  I use it in combination with tempo and sample rate to
> determine the current beat, in some applications.  In your case, I
> would look to see how and when that value jumps around when the play
> state is toggled (via UI button I assume).  I would definitely also
> keep an eye on the isCycling parameters, transportChanged params, and,
> as implied above, try to use samples instead of musical time when you
> can.
>
> One last observation: I have often forgot that the events or beats I
> am looking for may be in the middle of the current buffer, not at the
> beginning (sample 0).  That is why it doesn't surprise me so see a
> beat value of 21.768759.  It is supposed to be the host's best
> approximation of what is the "beat" of sample 0 for the current
> buffer.  As such, he host may be giving momentarily stale information
> on a state transition that occurs/occurred in the middle of a
> rendering cycle.  Also the UI might not, in that moment, accurately
> represent what is happening in the audio chain (i.e. threading races,
> as implied above).
>
> Sorry for the lengthy response, but I hope it helps!
>
> >
> >
> > 2015-01-15 19:44 GMT+02:00 Christian Rober <[email protected]>:
> >>
> >> On OS X, your host may set a property on your Audio Unit enumerated as
> >> kAudioUnitProperty_HostCallbacks.  The payload of the property is the
> >> struct HostCallbackInfo, which in turn has a set of C function
> >> callbacks.  If that property is set by the host, you can extrapolate
> >> the playback state and current beat position by calling those
> >> functions.  AUBase has a handy wrapper around all of this, of course.
> >>
> >> Note: it is not guaranteed that a host who provides the struct will
> >> return all the information from the output parameters to the
> >> functions.
> >>
> >> I have been able to call this at the beginning of each render cycle on
> >> most hosts, and I believe this to be the standard way it is
> >> implemented.  So you should only really need to call it before you
> >> render/process the samples per cycle.
> >>
> >> For the record, this struct also exists on iOS, but via the Inter-App
> >> Audio layer of the Audio Unit API.
> >>
> >> Hope that helps.
> >>
> >> --Christian
> >>
> >> On Thu, Jan 15, 2015 at 12:11 PM, Nick <[email protected]> wrote:
> >> > Hi
> >> > Is there a way to get a notification in audio unit that a host started
> >> > playback, and get a function called every metronome beat/or bar
> change?
> >> > Thank you
> >> >
> >> >  _______________________________________________
> >> > Do not post admin requests to the list. They will be ignored.
> >> > Coreaudio-api mailing list      ([email protected])
> >> > Help/Unsubscribe/Update your Subscription:
> >> >
> >> >
> https://lists.apple.com/mailman/options/coreaudio-api/recapitch%40gmail.com
> >> >
> >> > This email sent to [email protected]
> >
> >
>
 _______________________________________________
Do not post admin requests to the list. They will be ignored.
Coreaudio-api mailing list      ([email protected])
Help/Unsubscribe/Update your Subscription:
https://lists.apple.com/mailman/options/coreaudio-api/archive%40mail-archive.com

This email sent to [email protected]

Reply via email to