[wdmaudiodev] Re: External clock synchronization and sample rate issue

  • From: "Philip Lukidis" <plukidis@xxxxxxxxxxxxx>
  • To: <wdmaudiodev@xxxxxxxxxxxxx>
  • Date: Fri, 19 Jan 2007 11:25:59 -0500

Hello Mitch, I've been getting some strange things here, especially with 
subdevice unregistration.  I hope you don't mind me asking a few other 
questions.

a) When I am unregistering the waveminiport or topologyminiport (I do both for 
now), its destructor gets called.  Is this to be expected?  If so, no problem, 
I am copying with it now (see b) below).
b) Since destruction of my miniports results in the releasing of the port and 
the ungregistersubdevice/unregisterphysicalconnection interfaces, I now do an 
AddRef() on both the port and these interfaces in my worker thread, since I 
need them around for physical connection unregistration.  OK fine, but verifier 
bugchecks, warning of leaks, which turn out to be my adapters.  The only 
outstanding reference to my adapters, at least as far as I can see, comes from 
PcRegisterAdapterPowerManagement.  When I normally don't shift sample rate, my 
adapters are never leaked.  Is there a way to unregister for power management?
c) You mentioned in your list to perform actions 6) and 7) in said order, but 
should that hold only after dynamic ungregistration and physical disconnection? 
 The WDK MSVAD and AC97 examples always register subdevices first, and perform 
physical connections second (in StartDevice).

thanks for any help,

Philip Lukidis

> -----Original Message-----
> From: wdmaudiodev-bounce@xxxxxxxxxxxxx
> [mailto:wdmaudiodev-bounce@xxxxxxxxxxxxx]On Behalf Of Mitchell Rundle
> Sent: Wednesday, January 17, 2007 1:15 PM
> To: wdmaudiodev@xxxxxxxxxxxxx
> Subject: [wdmaudiodev] Re: External clock synchronization and sample
> rate issue
> 
> 
> It should be sufficient to just toggle the presence and name 
> of the topology filter.  The wave filter can generally be left alone.
> 
> You should use IUnregisterSubdevice and 
> IUnregisterPhysicalConnection for this (see portcls.h) and 
> you should unregister/register subdevices and physical 
> connections in the following order:
> 
> 1) unregister the topology subdevice
> 2) unregister the physical connection between the wave and 
> topology filters
> 3) release the topology subdevice
> 4) flip whatever bits you need in the wave subdevice to 
> change the format capabilities
> 5) create a new topology subdevice with a new name
> 6) register the new physical connection
> 7) register the new subdevice
> 
> It might seem more natural to switch the order of (1) and (2) 
> as well as (6) and (7).  Doing so however introduces a race 
> condition between subdevice registration and the endpoint 
> builder service and you may will end up with a bogus 
> "disabled" endpoint associated with the bridge pin on the wave device.
> 
> Regards,
> Mitch Rundle
> 
> This posting is provided "AS IS" with no warranties, and 
> confers no rights.
> 
> -----Original Message-----
> From: wdmaudiodev-bounce@xxxxxxxxxxxxx 
> [mailto:wdmaudiodev-bounce@xxxxxxxxxxxxx] On Behalf Of Frank Yerrace
> Sent: Wednesday, January 17, 2007 8:56 AM
> To: wdmaudiodev@xxxxxxxxxxxxx
> Subject: [wdmaudiodev] Re: External clock synchronization and 
> sample rate issue
> 
> Wouldn't creating different device IDs via a bus driver cause 
> multiple device driver installations. This would probably be 
> a worse user experience.
> 
> Frank Yerrace
> 
> This posting is provided "AS IS" with no warranties, and 
> confers no rights.
> 
> -----Original Message-----
> From: wdmaudiodev-bounce@xxxxxxxxxxxxx 
> [mailto:wdmaudiodev-bounce@xxxxxxxxxxxxx] On Behalf Of Philip Lukidis
> Sent: Wednesday, January 17, 2007 6:07 AM
> To: wdmaudiodev@xxxxxxxxxxxxx
> Subject: [wdmaudiodev] Re: External clock synchronization and 
> sample rate issue
> 
> Hello Jeff,
> 
> I'll have to see which approach is easier and go that route.  
> Probably the method you suggested is easier, as opposed to my 
> method of having a bus driver create a different ID based on 
> the sample rate, and having to call 
> IoInvalidateDeviceRelations to unload it in order to switch 
> rates, etc.  Since I already had a bus driver it wasn't a big 
> deal to test out.  I'll try it out with a topology/wave 
> subdevice pair.
> 
> thanks,
> 
> Philip Lukidis
> 
> > -----Original Message-----
> > From: wdmaudiodev-bounce@xxxxxxxxxxxxx
> > [mailto:wdmaudiodev-bounce@xxxxxxxxxxxxx]On Behalf Of Jeff Pages
> > Sent: Wednesday, January 17, 2007 6:47 AM
> > To: wdmaudiodev@xxxxxxxxxxxxx
> > Subject: [wdmaudiodev] Re: External clock synchronization and sample
> > rate issue
> >
> >
> > Hi Philip,
> >
> > I think I may have given you the wrong steer in an earlier
> > post. I said to
> > use multiple wave subdevices with a single topology
> > subdevice, but looking
> > at my code, I used multiple topology subdevices too, with one
> > pair of wave
> > and topology subdevices per sampling rate. It makes sense,
> > because the
> > engine sampling rate is associated with each endpoint, which
> > in turn relates
> > to a topology pin.
> >
> > Jeff
> >
> > ----- Original Message -----
> > From: "Philip Lukidis" <plukidis@xxxxxxxxxxxxx>
> > To: <wdmaudiodev@xxxxxxxxxxxxx>
> > Sent: Wednesday, January 17, 2007 8:00 AM
> > Subject: [wdmaudiodev] Re: External clock synchronization and
> > sample rate
> > issue
> >
> >
> > > Hello, I hope you don't mind if I ask a question again on
> > this topic.
> > > After a delay of a few days I managed to get back on this
> > and I got it to
> > > work- but only after a few somewhat painful measures.
> > >
> > > First I tried registering using the same HardwareID for my
> > device and
> > > registering the appropriate subdevice based on the selected
> > sample rate,
> > > but this did not work, despite the fact that I gave the 
> subdevice a
> > > different name (the name passed to PcRegisterSubdevice, and
> > KSStudio
> > > confirmed that the name was different).  My single
> > HardwareID in the INF
> > > would register all interfaces (one for each sample rate).
> > While it worked
> > > for first sample rate during installation, it never worked
> > for any other
> > > sample rate; the system kept on remembering the first
> > sample rate.  For
> > > now, I would switch sample rate by using a registry value.
> > So a "switch"
> > > is provoked by an unplug of the device, changing the
> > registry value, and
> > > replugging.  Also, this only worked with a
> > DataRangeIntersection handler-
> > > if I implemented a KSPROPERTY_PIN_PROPOSEDATAFORMAT
> > handler, it did NOT
> > > like an absence of 44100.
> > >
> > > I was only able to get it to work by moving to a different device
> > > altogether, by having my virtual bus driver announce a different
> > > HardwareID based on the sample rate (so we are no longer 
> talking of
> > > subdevices on a device object; the device object is now
> > different).  Of
> > > course, the first switch to a new rate provokes an
> > installation, which is
> > > not the end of the world, but not ideal either.
> > >
> > > My question is: can I get this scheme to work with just
> > registering the
> > > appropriate subdevice on the same device object based on
> > the sample rate
> > > (Frank Yerrace's text suggests- at least to me- that it
> > can)?  If so, any
> > > clues on what I may have overlooked?  I have not even yet
> > touched dynamic
> > > subdevice unregistration and dynamic physical disconnection.
> > >
> > > thanks,
> > >
> > > Philip Lukidis
> > >
> > >> -----Original Message-----
> > >> From: wdmaudiodev-bounce@xxxxxxxxxxxxx
> > >> [mailto:wdmaudiodev-bounce@xxxxxxxxxxxxx]On Behalf Of Jeff Pages
> > >> Sent: Wednesday, January 10, 2007 5:55 PM
> > >> To: wdmaudiodev@xxxxxxxxxxxxx
> > >> Subject: [wdmaudiodev] Re: External clock synchronization
> > and sample
> > >> rate issue
> > >>
> > >>
> > >> I had a similar problem, where I wanted the audio engine
> > >> sampling rate of
> > >> each endpoint to match the hardware clock on my card which
> > >> was set globally
> > >> in a driver property page.
> > >>
> > >> One of the Microsoft people suggested I have several 
> different wave
> > >> miniports (each with a different name) defined in my inf file
> > >> and driver,
> > >> with each supporting only one sampling rate in its pin
> > >> datarange structure,
> > >> and only instantiating the one corresponding to the hardware
> > >> clock. Since my
> > >> driver was unloaded and reloaded if the hardware clock was
> > >> changed in my
> > >> Device Manager property page, this was pretty easy to
> > >> implement and worked
> > >> well.
> > >>
> > >> In your case, where the external clock can change while
> > the driver's
> > >> running, you might be able to use the
> > >> IUnregisterPhysicalConnection and
> > >> IUnregisterSubdevice interfaces to remove the current
> > >> subdevice and then
> > >> activate and register the one corresponding to the new rate
> > >> (see the stuff
> > >> on Dynamic Audio Subdevices in the WDK).
> > >>
> > >> Jeff Pages
> > >> Innes Corporation Pty Ltd
> > >>
> > >> ----- Original Message -----
> > >> From: "Philip Lukidis" <plukidis@xxxxxxxxxxxxx>
> > >> To: <wdmaudiodev@xxxxxxxxxxxxx>
> > >> Sent: Thursday, January 11, 2007 9:20 AM
> > >> Subject: [wdmaudiodev] External clock synchronization and
> > >> sample rate issue
> > >>
> > >>
> > >> > Hello.  I'm wondering if anyone else has any clue about
> > >> solving this
> > >> > issue.  My audio device can be clocked from an external
> > >> source.  For
> > >> > example, the audio format of the device can be set to 16
> > >> bits 44100 in the
> > >> > advanced tab in the MS audio cpl, and thereafter using our
> > >> own control
> > >> > panel be clocked off an external source which is at the
> > >> same rate of
> > >> > 44100.
> > >> >
> > >> > Now say that the external source's clock changes from 44100
> > >> to 48000.
> > >> > Under XP, my datarange intersection handler would merely
> > >> constrain the
> > >> > format's sample rate to match the new external sample rate.
> > >>  Under Vista,
> > >> > the system will never try to send at any other rate other
> > >> than what is the
> > >> > selected rate in the advanced tab of the audio device.
> > >> >
> > >> > Does anyone have a suggestion as to how to cope with this?
> > >> Is there a way
> > >> > to programmatically change the selected format of the
> > >> device?  Or is there
> > >> > another approach?
> > >> >
> > >> > thank you,
> > >> >
> > >> > Philip Lukidis
> > >> > ******************
> > >> >
> > >> > WDMAUDIODEV addresses:
> > >> > Post message: mailto:wdmaudiodev@xxxxxxxxxxxxx
> > >> > Subscribe:
> > >> mailto:wdmaudiodev-request@xxxxxxxxxxxxx?subject=subscribe
> > >> > Unsubscribe:
> > >> mailto:wdmaudiodev-request@xxxxxxxxxxxxx?subject=unsubscribe
> > >> > Moderator:    mailto:wdmaudiodev-moderators@xxxxxxxxxxxxx
> > >> >
> > >> > URL to WDMAUDIODEV page:
> > >> > http://www.wdmaudiodev.com/
> > >> >
> > >> >
> > >>
> > >> ******************
> > >>
> > >> WDMAUDIODEV addresses:
> > >> Post message: mailto:wdmaudiodev@xxxxxxxxxxxxx
> > >> Subscribe:
> > >> mailto:wdmaudiodev-request@xxxxxxxxxxxxx?subject=subscribe
> > >> Unsubscribe:
> > >> mailto:wdmaudiodev-request@xxxxxxxxxxxxx?subject=unsubscribe
> > >> Moderator:    mailto:wdmaudiodev-moderators@xxxxxxxxxxxxx
> > >>
> > >> URL to WDMAUDIODEV page:
> > >> http://www.wdmaudiodev.com/
> > >>
> > >>
> > > ******************
> > >
> > > WDMAUDIODEV addresses:
> > > Post message: mailto:wdmaudiodev@xxxxxxxxxxxxx
> > > Subscribe:
> > mailto:wdmaudiodev-request@xxxxxxxxxxxxx?subject=subscribe
> > > Unsubscribe:
> > mailto:wdmaudiodev-request@xxxxxxxxxxxxx?subject=unsubscribe
> > > Moderator:    mailto:wdmaudiodev-moderators@xxxxxxxxxxxxx
> > >
> > > URL to WDMAUDIODEV page:
> > > http://www.wdmaudiodev.com/
> > >
> > >
> >
> > ******************
> >
> > WDMAUDIODEV addresses:
> > Post message: mailto:wdmaudiodev@xxxxxxxxxxxxx
> > Subscribe:
> > mailto:wdmaudiodev-request@xxxxxxxxxxxxx?subject=subscribe
> > Unsubscribe:
> > mailto:wdmaudiodev-request@xxxxxxxxxxxxx?subject=unsubscribe
> > Moderator:    mailto:wdmaudiodev-moderators@xxxxxxxxxxxxx
> >
> > URL to WDMAUDIODEV page:
> > http://www.wdmaudiodev.com/
> >
> >
> ******************
> 
> WDMAUDIODEV addresses:
> Post message: mailto:wdmaudiodev@xxxxxxxxxxxxx
> Subscribe:    
mailto:wdmaudiodev-request@xxxxxxxxxxxxx?subject=subscribe
Unsubscribe:  mailto:wdmaudiodev-request@xxxxxxxxxxxxx?subject=unsubscribe
Moderator:    mailto:wdmaudiodev-moderators@xxxxxxxxxxxxx

URL to WDMAUDIODEV page:
http://www.wdmaudiodev.com/

******************

WDMAUDIODEV addresses:
Post message: mailto:wdmaudiodev@xxxxxxxxxxxxx
Subscribe:    mailto:wdmaudiodev-request@xxxxxxxxxxxxx?subject=subscribe
Unsubscribe:  mailto:wdmaudiodev-request@xxxxxxxxxxxxx?subject=unsubscribe
Moderator:    mailto:wdmaudiodev-moderators@xxxxxxxxxxxxx

URL to WDMAUDIODEV page:
http://www.wdmaudiodev.com/

******************

WDMAUDIODEV addresses:
Post message: mailto:wdmaudiodev@xxxxxxxxxxxxx
Subscribe:    mailto:wdmaudiodev-request@xxxxxxxxxxxxx?subject=subscribe
Unsubscribe:  mailto:wdmaudiodev-request@xxxxxxxxxxxxx?subject=unsubscribe
Moderator:    mailto:wdmaudiodev-moderators@xxxxxxxxxxxxx

URL to WDMAUDIODEV page:
http://www.wdmaudiodev.com/

******************

WDMAUDIODEV addresses:
Post message: mailto:wdmaudiodev@xxxxxxxxxxxxx
Subscribe:    mailto:wdmaudiodev-request@xxxxxxxxxxxxx?subject=subscribe
Unsubscribe:  mailto:wdmaudiodev-request@xxxxxxxxxxxxx?subject=unsubscribe
Moderator:    mailto:wdmaudiodev-moderators@xxxxxxxxxxxxx

URL to WDMAUDIODEV page:
http://www.wdmaudiodev.com/

Other related posts: