/* start new player thread */ static void BarMainStartPlayback (BarApp_t *app, pthread_t *playerThread) { BarUiPrintSong (&app->settings, app->playlist, app->curStation->isQuickMix ? PianoFindStationById (app->ph.stations, app->playlist->stationId) : NULL); if (app->playlist->audioUrl == NULL) { BarUiMsg (&app->settings, MSG_ERR, "Invalid song url.\n"); } else { /* setup player */ memset (&app->player, 0, sizeof (app->player)); WaitressInit (&app->player.waith); WaitressSetUrl (&app->player.waith, app->playlist->audioUrl); /* set up global proxy, player is NULLed on songfinish */ if (app->settings.proxy != NULL) { WaitressSetProxy (&app->player.waith, app->settings.proxy); } app->player.gain = app->playlist->fileGain; if ( !app->mute ) { app->player.scale = BarPlayerCalcScale (app->player.gain + app->settings.volume); } app->player.audioFormat = app->playlist->audioFormat; app->player.settings = &app->settings; pthread_mutex_init (&app->player.pauseMutex, NULL); pthread_cond_init (&app->player.pauseCond, NULL); /* throw event */ BarUiStartEventCmd (&app->settings, "songstart", app->curStation, app->playlist, &app->player, app->ph.stations, PIANO_RET_OK, WAITRESS_RET_OK); BarDownloadStart(app); /* prevent race condition, mode must _not_ be FREED if * thread has been started */ app->player.mode = PLAYER_STARTING; /* start player */ pthread_create (playerThread, NULL, BarPlayerThread, &app->player); } }
static void BarUiActUpdateScale (BarApp_t *app) { /* FIXME: assuming unsigned integer store is atomic operation */ app->player.scale = BarPlayerCalcScale (app->player.gain + app->settings.volume); }
/* start new player thread */ static void BarMainStartPlayback (BarApp_t *app, pthread_t *playerThread) { PianoReturn_t pRet; WaitressReturn_t wRet; /* is this an advertising track? */ if (app->playlist->adToken != NULL) { PianoRequestDataGetAdMetadata_t adReqData; adReqData.token = app->playlist->adToken; adReqData.quality = app->settings.audioQuality; BarUiMsg (&app->settings, MSG_INFO, "Fetching ads with token %s... ", adReqData.token); BarUiPianoCall (app, PIANO_REQUEST_GET_AD_METADATA, &adReqData, &pRet, &wRet); /* got token? */ if (adReqData.retTokenCount > 0) { PianoRequestDataRegisterAd_t regReqData; regReqData.token = adReqData.retToken; regReqData.tokenCount = adReqData.retTokenCount; regReqData.station = app->curStation; BarUiMsg (&app->settings, MSG_INFO, "Registering ad... "); BarUiPianoCall (app, PIANO_REQUEST_REGISTER_AD, ®ReqData, &pRet, &wRet); // change the current song to the actual audio ad url app->playlist->audioUrl = adReqData.audioUrl; // you can configure to get silence instead of ads or you can choose // to hear the ads. The default is silence if (app->settings.silenceAds) { app->playlist->fileGain = -999; app->playlist->title = strdup("Audio Ad (Silenced)"); } else { app->playlist->fileGain = adReqData.fileGain; app->playlist->title = strdup("Audio Ad"); } app->playlist->audioFormat = adReqData.audioFormat; app->playlist->artist = strdup("advertiser"); app->playlist->album = strdup("pianobar"); /* delete */ for (size_t i = 0; i < adReqData.retTokenCount; i++) { free (adReqData.retToken[i]); } free (adReqData.retToken); } } BarUiPrintSong (&app->settings, app->playlist, app->curStation->isQuickMix ? PianoFindStationById (app->ph.stations, app->playlist->stationId) : NULL); if (app->playlist->audioUrl == NULL) { BarUiMsg (&app->settings, MSG_ERR, "Invalid song url.\n"); } else { /* setup player */ memset (&app->player, 0, sizeof (app->player)); WaitressInit (&app->player.waith); WaitressSetUrl (&app->player.waith, app->playlist->audioUrl); /* set up global proxy, player is NULLed on songfinish */ if (app->settings.proxy != NULL) { WaitressSetProxy (&app->player.waith, app->settings.proxy); } app->player.gain = app->playlist->fileGain; app->player.scale = BarPlayerCalcScale (app->player.gain + app->settings.volume); app->player.audioFormat = app->playlist->audioFormat; app->player.settings = &app->settings; pthread_mutex_init (&app->player.pauseMutex, NULL); pthread_cond_init (&app->player.pauseCond, NULL); /* throw event */ BarUiStartEventCmd (&app->settings, "songstart", app->curStation, app->playlist, &app->player, app->ph.stations, PIANO_RET_OK, WAITRESS_RET_OK); /* prevent race condition, mode must _not_ be FREED if * thread has been started */ app->player.mode = PLAYER_STARTING; /* start player */ pthread_create (playerThread, NULL, BarPlayerThread, &app->player); } }