|  | @@ -107,10 +107,7 @@ static void cspotTask(void *pvParameters) {
 | 
	
		
			
				|  |  |          ESP_LOGI(TAG, "Creating Spotify(CSpot) player");
 | 
	
		
			
				|  |  |  		
 | 
	
		
			
				|  |  |          // Auth successful
 | 
	
		
			
				|  |  | -        if (token.size() > 0) {
 | 
	
		
			
				|  |  | -			// tell sink that we are taking over
 | 
	
		
			
				|  |  | -			cspot.cHandler(CSPOT_SETUP, 44100);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | +        if (token.size() > 0 && cspot.cHandler(CSPOT_SETUP, 44100)) {
 | 
	
		
			
				|  |  |  			auto audioSink = std::make_shared<ShimAudioSink>();
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              // @TODO Actually store this token somewhere
 | 
	
	
		
			
				|  | @@ -137,7 +134,6 @@ static void cspotTask(void *pvParameters) {
 | 
	
		
			
				|  |  |  				break;
 | 
	
		
			
				|  |  |  			case CSpotEventType::DISC:
 | 
	
		
			
				|  |  |  				cspot.cHandler(CSPOT_DISC);				
 | 
	
		
			
				|  |  | -				spircController->stopPlayer();
 | 
	
		
			
				|  |  |  				mercuryManager->stop();
 | 
	
		
			
				|  |  |  				break;
 | 
	
		
			
				|  |  |  			case CSpotEventType::PREV:
 | 
	
	
		
			
				|  | @@ -163,11 +159,13 @@ static void cspotTask(void *pvParameters) {
 | 
	
		
			
				|  |  |              };
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              mercuryManager->handleQueue();
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | +        
 | 
	
		
			
				|  |  | +			// release controllers
 | 
	
		
			
				|  |  | +			mercuryManager.reset();
 | 
	
		
			
				|  |  | +			spircController.reset();
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -		// release all ownership
 | 
	
		
			
				|  |  | -		mercuryManager.reset();
 | 
	
		
			
				|  |  | -		spircController.reset();
 | 
	
		
			
				|  |  | +		// release auth blob
 | 
	
		
			
				|  |  |  		cspot.blob.reset();
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  		// flush files
 | 
	
	
		
			
				|  | @@ -200,6 +198,9 @@ struct cspot_s* cspot_create(const char *name, cspot_cmd_cb_t cmd_cb, cspot_data
 | 
	
		
			
				|  |  |   * Commands sent by local buttons/actions
 | 
	
		
			
				|  |  |   */
 | 
	
		
			
				|  |  |  bool cspot_cmd(struct cspot_s* ctx, cspot_event_t event, void *param) {
 | 
	
		
			
				|  |  | +	// we might have not controller left
 | 
	
		
			
				|  |  | +	if (!spircController.use_count()) return false;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  	switch(event) {
 | 
	
		
			
				|  |  |  		case CSPOT_PREV:
 | 
	
		
			
				|  |  |  			spircController->prevSong();
 | 
	
	
		
			
				|  | @@ -217,8 +218,7 @@ bool cspot_cmd(struct cspot_s* ctx, cspot_event_t event, void *param) {
 | 
	
		
			
				|  |  |  			spircController->setPause(false);
 | 
	
		
			
				|  |  |  			break;
 | 
	
		
			
				|  |  |  		case CSPOT_DISC:
 | 
	
		
			
				|  |  | -			spircController->stopPlayer();
 | 
	
		
			
				|  |  | -			mercuryManager->stop();
 | 
	
		
			
				|  |  | +			spircController->disconnect();
 | 
	
		
			
				|  |  |  			break;
 | 
	
		
			
				|  |  |  		case CSPOT_STOP:
 | 
	
		
			
				|  |  |  			spircController->stopPlayer();
 |