---------- Forwarded message ----------
From: Dave O'Neill <[email protected]>
Date: Sat, Mar 7, 2015 at 9:44 AM
Subject: Re: How does one update a view position during a core audio render
callback?
To: "Patrick J. Collins" <[email protected]>


The simplest way to do is to just set a variable to your current time in
your render callback.  And then employ a repeating timer to check that
value and update your view on the main thread.

@implementation MyObject{
    float currentTime;
}

OSStatus myRenderCallback{
    MyObject *object = (MyObject *)inRefCon;
    object->currentTime = CalculateTimeOnRenderThread(); //with no Obj-C
messaging!
}

-(void)myTimerCallback{
   self.playhead.position = currentTime;
}

If you want it to refresh the currentTime faster than the render callback
you should get the mach_absolute_time() at the start of playing and again
in your timer and calculate the difference.

@implementation MyObject{
    UInt64 startMachTime;
}
// if you need accuracy get the mHostTime from your render callback
// otherwise do this

-(void)startAudio{
   startMachTime = mach_absolute_time();
}

-(void)myTimerCallback{
   UInt64 ticksSinceStart = mach_absolute_time() - startMachTime;
   self.playhead.position = convertTicksToSeconds(ticksSinceStart);
}

A CADisplyLink is an excellent timer for this

On Sat, Mar 7, 2015 at 9:17 AM, Patrick J. Collins <
[email protected]> wrote:

> Hi,
>
> So I have plotted out a waveform, and simply want to have a vertical
> line represent a playhead which will move across the waveform's X-axis
> as it plays.
>
> I am using an NSBox as my playhead, and in my callback proc, I tried doing
> inside the loop:
>
>   player->sampler.playheadView.position =
> player->sampler.playheadView.containerWidth / player->buffer.size *
> currentSampleIndex
>
> my playheadView's position setter just does this:
>
> -(void)setPosition:(NSUInteger)position {
>     if (position == self.position) return;
>     [self setFrameOrigin:NSMakePoint(position, 0)];
> }
>
> However, this causes everything to slow down to the point that the audio
> plays
> with clicks and gaps inbetween the frames..
>
> I changed this to do a performSelectorOnMainThread, where this operation
> occurs, but it seems like the playhead only gets updated a handful of times
> during playback, so it does not look good..
>
> What is the ideal way to get visual feedback like this during playback?
>
> Thanks!
>
> Patrick J. Collins
> http://collinatorstudios.com
>
>  _______________________________________________
> 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/oneill707%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