[RDP] Anyone know why rdairplay sends TWO SP commands?

Dan Mills dmills at exponent.myzen.co.uk
Sun Oct 28 18:23:51 EDT 2007


On Sat, 2007-10-27 at 20:37 -0400, Fred Gleason wrote:
> On Saturday 27 October 2007 18:15, Dan Mills wrote:
> > So that is 3 spurious stops on handle 50, and one spurious unload on
> > handle 50, something is rotten in rdairplay.
> 
> So it appears.

Pop quiz time, what is wrong with this:

void RDPlayDeck::stop(int interval,int gain)
{
  if((play_state!=RDPlayDeck::Playing)&&(play_state!=RDPlayDeck::Stopping)) {
    return;
  }
  if((interval<=0)||pause_called) {
    stop();
  }
  else {
    if(gain!=0){
    play_cae->fadeOutputVolume(play_card,play_stream,play_port,
	  		           gain+play_cut_gain+play_duck_level,interval);
    }
  }
  play_stop_timer->start(interval,true);
  stop_called=true;
  play_state=RDPlayDeck::Stopping;  
}

Bad case of a brace in the wrong place!

We are setting the stop timer to fire a stop request as soon as we
return to the main loop, but already called stop in the case where
interval == 0. 

There is still something rotten with segues even with this fixed as we
are calling RDPlayDeck::stop():

  0x00002ad8774802fd in RDPlayDeck::stop (this=0x7024f0) at rdplay_deck.cpp:470
#4  0x0000000000443862 in LogPlay::segueEndData (this=0x700460, id=15) at log_play.cpp:1284
#5  0x000000000045699d in LogPlay::qt_invoke (this=0x700460, _id=6, _o=0x7fff33b93550) at moc_log_play.cpp:369

After something else has already stopped the transport. Finding the
something else is going to be interesting however. 

BTW: Fred, how would you feel about my leaving some very picky asserts
in the code and just defining -DNDEBUG for release builds, crashes that
give useful data are good in CVS.

Regards, Dan.











More information about the Rivendell-prog mailing list