|  | @@ -31,15 +31,15 @@ SpircHandler::SpircHandler(std::shared_ptr<cspot::Context> ctx) {
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |    };
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  auto trackLoadedCallback = [this](std::shared_ptr<QueuedTrack> track) {
 | 
	
		
			
				|  |  | -    playbackState->setPlaybackState(PlaybackState::State::Playing);
 | 
	
		
			
				|  |  | +  auto trackLoadedCallback = [this](std::shared_ptr<QueuedTrack> track, bool paused = false) {
 | 
	
		
			
				|  |  | +    playbackState->setPlaybackState(paused ? PlaybackState::State::Paused : PlaybackState::State::Playing);
 | 
	
		
			
				|  |  |      playbackState->updatePositionMs(track->requestedPosition);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      this->notify();
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    // Send playback start event, unpause
 | 
	
		
			
				|  |  | +    // Send playback start event, pause/unpause per request
 | 
	
		
			
				|  |  |      sendEvent(EventType::PLAYBACK_START, (int)track->requestedPosition);
 | 
	
		
			
				|  |  | -    sendEvent(EventType::PLAY_PAUSE, false);
 | 
	
		
			
				|  |  | +    sendEvent(EventType::PLAY_PAUSE, paused);
 | 
	
		
			
				|  |  |    };
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    this->ctx = ctx;
 | 
	
	
		
			
				|  | @@ -77,6 +77,12 @@ void SpircHandler::subscribeToMercury() {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  void SpircHandler::loadTrackFromURI(const std::string& uri) {}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +void SpircHandler::notifyAudioEnded() {
 | 
	
		
			
				|  |  | +    playbackState->updatePositionMs(0);
 | 
	
		
			
				|  |  | +    notify();
 | 
	
		
			
				|  |  | +    trackPlayer->resetState(true);
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  void SpircHandler::notifyAudioReachedPlayback() {
 | 
	
		
			
				|  |  |    int offset = 0;
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -142,7 +148,6 @@ void SpircHandler::handleFrame(std::vector<uint8_t>& data) {
 | 
	
		
			
				|  |  |        notify();
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |        sendEvent(EventType::SEEK, (int)playbackState->remoteFrame.position);
 | 
	
		
			
				|  |  | -      //sendEvent(EventType::FLUSH);
 | 
	
		
			
				|  |  |        break;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |      case MessageType_kMessageTypeVolume:
 | 
	
	
		
			
				|  | @@ -157,12 +162,14 @@ void SpircHandler::handleFrame(std::vector<uint8_t>& data) {
 | 
	
		
			
				|  |  |        setPause(false);
 | 
	
		
			
				|  |  |        break;
 | 
	
		
			
				|  |  |      case MessageType_kMessageTypeNext:
 | 
	
		
			
				|  |  | -      nextSong();
 | 
	
		
			
				|  |  | -      sendEvent(EventType::NEXT);
 | 
	
		
			
				|  |  | +      if (nextSong()) {
 | 
	
		
			
				|  |  | +        sendEvent(EventType::NEXT);
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  |        break;
 | 
	
		
			
				|  |  |      case MessageType_kMessageTypePrev:
 | 
	
		
			
				|  |  | -      previousSong();
 | 
	
		
			
				|  |  | -      sendEvent(EventType::PREV);
 | 
	
		
			
				|  |  | +      if (previousSong()) {
 | 
	
		
			
				|  |  | +        sendEvent(EventType::PREV);
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  |        break;
 | 
	
		
			
				|  |  |      case MessageType_kMessageTypeLoad: {
 | 
	
		
			
				|  |  |        this->trackPlayer->start();
 | 
	
	
		
			
				|  | @@ -199,8 +206,8 @@ void SpircHandler::handleFrame(std::vector<uint8_t>& data) {
 | 
	
		
			
				|  |  |                                 false);
 | 
	
		
			
				|  |  |        this->notify();
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -      trackPlayer->resetState();
 | 
	
		
			
				|  |  |        sendEvent(EventType::FLUSH);
 | 
	
		
			
				|  |  | +      trackPlayer->resetState();
 | 
	
		
			
				|  |  |        break;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |      case MessageType_kMessageTypeShuffle: {
 | 
	
	
		
			
				|  | @@ -227,34 +234,22 @@ void SpircHandler::notify() {
 | 
	
		
			
				|  |  |    this->sendCmd(MessageType_kMessageTypeNotify);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -void SpircHandler::skipSong(TrackQueue::SkipDirection dir) {
 | 
	
		
			
				|  |  | -  if (trackQueue->skipTrack(dir)) {
 | 
	
		
			
				|  |  | -    playbackState->setPlaybackState(PlaybackState::State::Playing);
 | 
	
		
			
				|  |  | -    notify();
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    // Reset track state
 | 
	
		
			
				|  |  | -    trackPlayer->resetState();
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    sendEvent(EventType::PLAY_PAUSE, false);
 | 
	
		
			
				|  |  | -  } else {
 | 
	
		
			
				|  |  | -    playbackState->setPlaybackState(PlaybackState::State::Paused);
 | 
	
		
			
				|  |  | -    playbackState->updatePositionMs(0);
 | 
	
		
			
				|  |  | -    notify();
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    sendEvent(EventType::PLAY_PAUSE, true);
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | +bool SpircHandler::skipSong(TrackQueue::SkipDirection dir) {  
 | 
	
		
			
				|  |  | +  bool skipped = trackQueue->skipTrack(dir);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  notify();
 | 
	
		
			
				|  |  | +  // Reset track state
 | 
	
		
			
				|  |  | +  trackPlayer->resetState(!skipped);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  sendEvent(EventType::FLUSH);
 | 
	
		
			
				|  |  | +  // send NEXT or PREV event only when successful
 | 
	
		
			
				|  |  | +  return skipped;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -void SpircHandler::nextSong() {
 | 
	
		
			
				|  |  | -  skipSong(TrackQueue::SkipDirection::NEXT);
 | 
	
		
			
				|  |  | +bool SpircHandler::nextSong() {
 | 
	
		
			
				|  |  | +  return skipSong(TrackQueue::SkipDirection::NEXT);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -void SpircHandler::previousSong() {
 | 
	
		
			
				|  |  | -  skipSong(TrackQueue::SkipDirection::PREV);
 | 
	
		
			
				|  |  | +bool SpircHandler::previousSong() {
 | 
	
		
			
				|  |  | +  return skipSong(TrackQueue::SkipDirection::PREV);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  std::shared_ptr<TrackPlayer> SpircHandler::getTrackPlayer() {
 |