コード例 #1
0
ファイル: main.c プロジェクト: robertkrimen/pianobar
/*	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);
	}
}
コード例 #2
0
ファイル: ui_act.c プロジェクト: EliasOenal/pianobar
static void BarUiActUpdateScale (BarApp_t *app) {
	/* FIXME: assuming unsigned integer store is atomic operation */
	app->player.scale = BarPlayerCalcScale (app->player.gain + app->settings.volume);
}
コード例 #3
0
ファイル: main.c プロジェクト: BillyWizz/pianobar
/*	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, &regReqData, &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);
	}
}