123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322 |
- /** (c) Nullsoft, Inc. C O N F I D E N T I A L
- ** Filename:
- ** Project:
- ** Description:
- ** Author:
- ** Created:
- **/
- #include "Main.h"
- #include "resource.h"
- #include "strutil.h"
- #include "../nu/AutoChar.h"
- #include "../nu/AutoCharFn.h"
- #include "MediaCoreCOM.h"
- #include "externalCOM.h"
- #include "JSAPI2_CallbackManager.h"
- static int in_play;
- extern int no_notify_play;
- void Play(const wchar_t *playstring)
- {
- int i = -31337;
- static int a = -2;
- AutoCharFn charFn(playstring);
- // added in 5.64 - this helps to keep the currently playing file after
- // a tag update to stay playing correctly when it is no longer in the
- // main playlist editor - this helps to keep a consistent ui experience
- bool restart = false;
- if (no_notify_play && playstring && *playstring && !PlayList_getlength())
- {
- PlayList_insert(0, playstring);
- restart = true;
- }
- in_play = 1;
- g_video_numaudiotracks = 1;
- g_video_curaudiotrack = 0;
- g_stopaftercur = 0;
- CheckMenuItem(main_menu, WINAMP_BUTTON4_CTRL, MF_UNCHECKED);
- CheckMenuItem(GetSubMenu(top_menu, 3), WINAMP_BUTTON4_CTRL, MF_UNCHECKED);
- g_has_deleted_current = 0;
- Skin_Random();
- Stats_OnPlay(playstring);
- // has cropped up in a few crash reports where app_name is null which causes the update to bork
- // when receiving a 'stop' command and we try to send an update via JSAPI1_CurrentTitleChanged()
- if (!app_name || app_name && !*app_name || (unsigned int)(ULONG_PTR)app_name < 65536)
- BuildAppName();
- set_caption(0, L"%s - %S", (config_dotasknum?FileTitleNum:FileTitle), app_name); // TODO: benski> get rid of FileTitle here
- eq_autoload(charFn);
- if (a == -2)
- a = PlayList_getlength();
- if (!*playstring || (i = in_open(playstring)))
- {
- if (*playstring && i != -31337 && --a) //-31337 == no_sound_card
- {
- PostMessageW(hMainWindow, WM_WA_MPEG_EOF, 0, 0);
- }
- else
- {
- if (i == -31337) in_mod = 0;
- StopPlaying(0);
- a = -2;
- }
- in_play = 0;
- return ;
- }
- else
- {
- a = -2;
- }
- SendMessageW(hMainWindow, WM_TIMER, UPDATE_DISPLAY_TIMER + 4, 0);
- PlayList_refreshtitle();
- PlayList_GetCurrentTitle(FileTitle, FILETITLE_SIZE); // TODO: benski> don't want to be using global FileTitle here
- // has cropped up in a few crash reports where app_name is null which causes the update to bork
- // when receiving a 'stop' command and we try to send an update via JSAPI1_CurrentTitleChanged()
- if (!app_name || app_name && !*app_name || (unsigned int)(ULONG_PTR)app_name < 65536) BuildAppName();
- set_caption(0, L"%s - %S", (config_dotasknum?FileTitleNum:FileTitle), app_name);
- if (in_mod && in_mod->is_seekable) draw_positionbar(0, 0);
- plEditSelect(PlayList_getPosition());
- SetTimer(hMainWindow, UPDATE_DISPLAY_TIMER, 100, NULL);
- playing = 1;
- draw_playicon(1);
- ui_songposition = 0;
- draw_songname(FileTitle, &ui_songposition, in_getlength());
- if (config_visplugin_autoexec && !vis_running())
- vis_start(hMainWindow, NULL);
- if (!dsp_isactive()) dsp_init();
- paused = 0;
- // added in 5.64
- if(restart) PlayList_deleteitem(0);
- if (!no_notify_play)
- {
- // don't tell anyone we're playing the file is there are hidden items or there's an ad curtain
- if (PlayList_hasanycurtain(PlayList_getPosition()) == 0 && PlayList_ishidden(PlayList_getPosition()) == 0)
- {
- SendMessageW(hMainWindow, WM_WA_IPC, (WPARAM)(char *)charFn, IPC_PLAYING_FILE);
- SendMessageW(hMainWindow, WM_WA_IPC, (WPARAM)playstring, IPC_PLAYING_FILEW);
- SendNotifyMessage(HWND_BROADCAST, songChangeBroadcastMessage, 0, 0);
- }
- }
- in_play = 0;
- PostMessageW(hMainWindow, WM_WA_IPC, IPC_CB_MISC_STATUS, IPC_CB_MISC);
- MediaCoreCOM *mediaCore;
- if (SUCCEEDED(JSAPI1_GetMediaCoreCOM(&mediaCore)))
- {
- mediaCore->OnPlay();
- mediaCore->Release();
- }
- JSAPI2::callbackManager.OnPlay(FileName);
- }
- void StartPlaying()
- {
- // reset this flag when we start playing otherwise
- // it can cause it to be incorrectly applied later
- plcleared = 0;
- if (playing) StopPlaying(0);
- if (in_play) return ;
- {
- // Check if we have the media library , if we do check to see if we have and ad curtain
- // If we do, and the current item is the first item, display it
- const char *adcurtain = PlayList_getcurtain(PlayList_getPosition());
- if (adcurtain && *adcurtain)
- {
- if (*adcurtain == 'a')
- {
- // 'a' means it's an Ad, so pop out of fullscreen.
- if ( videoIsFullscreen() ) videoForceFullscreenOff();
- adcurtain = CharNextA(adcurtain); // get past the a in ahttp://....
- }
- }
- }
- if (!no_notify_play)
- {
- PlayList_getcurrent(FileName, FileTitle, FileTitleNum);
- }
- Play(FileName);
- }
- /* -------- Stoppping -------- */
- // TODO: avoid passing g_quit
- void ClassicSkin_OnStop(int g_quit)
- {
- if (playing)
- {
- KillTimer(hMainWindow, UPDATE_DISPLAY_TIMER);
- }
- if (!g_quit)
- {
- sa_setthread(0);
- if (!no_notify_play)
- {
- PlayList_getcurrent_onstop(FileName, FileTitle);
- if (*FileTitle)
- {
- wchar_t titleStr[64] = {0};
- set_caption(0, getStringW(IDS_TITLE_ON_STOP,titleStr,64), (config_dotasknum?FileTitleNum:FileTitle), app_name);
- }
- else
- {
- // has cropped up in a few crash reports where app_name is null which causes the update to bork
- // when receiving a 'stop' command and we try to send an update via JSAPI1_CurrentTitleChanged()
- if (!app_name || app_name && !*app_name || (unsigned int)(ULONG_PTR)app_name < 65536) BuildAppName();
- set_caption(0, L"%S %S", (!app_name || app_name && !*app_name ? "Winamp" : app_name), app_version_string);
- }
- plEditSelect(PlayList_getPosition());
- }
- draw_setnoupdate(1);
- draw_clear();
- draw_monostereo(0);
- draw_clutterbar(0);
- draw_playicon(2);
- draw_shuffle(config_shuffle, 0);
- draw_eject(0);
- draw_eqplbut(config_eq_open, 0, config_pe_open, 0);
- draw_repeat(config_repeat, 0);
- draw_volumebar(config_volume, 0);
- draw_panbar(config_pan, 0);
- draw_buttonbar( -1);
- if (config_pe_height != 14)
- draw_pe_timedisp(NULL, 0, 0, 0, 1);
- draw_songname(FileTitle, &ui_songposition, PlayList_getcurrentlength());
- draw_setnoupdate(0);
- last_brate = -1;
- }
- }
- void StopPlaying(int g_quit)
- {
- if (in_play) return ;
- in_play = 1;
- g_has_deleted_current = 0;
- int last_time = 0;
- if (!g_fullstop) // if this wasn't an EOF situation, grab the current time so that the callback can be told the stop time.
- last_time = in_getouttime();
-
- if (playing)
- {
- paused = 0;
- playing = 0;
- g_video_numaudiotracks = 1;
- g_video_curaudiotrack = 0;
- in_close();
- }
- ClassicSkin_OnStop(g_quit);
- in_play = 0;
- stopPlayingInfoStruct infoStruct;
- infoStruct.g_fullstop = g_fullstop;
- infoStruct.last_time = last_time;
- SendMessageW(hMainWindow, WM_WA_IPC, (WPARAM)&infoStruct, IPC_STOPPLAYING);
- PostMessageW(hMainWindow, WM_WA_IPC, IPC_CB_MISC_STATUS, IPC_CB_MISC);
-
- MediaCoreCOM *mediaCore;
- if (SUCCEEDED(JSAPI1_GetMediaCoreCOM(&mediaCore)))
- {
- mediaCore->OnStop(last_time, g_fullstop);
- mediaCore->Release();
- }
- JSAPI2::callbackManager.OnStop(last_time, g_fullstop);
- }
- void Skin_OnPause()
- {
- wchar_t titleStr[64] = {0};
- set_caption(0, getStringW(IDS_TITLE_ON_PAUSE,titleStr,64), (config_dotasknum?FileTitleNum:FileTitle), app_name);
- draw_playicon(4);
- }
- void Skin_OnUnpause()
- {
- // has cropped up in a few crash reports where app_name is null which causes the update to bork
- // when receiving a 'stop' command and we try to send an update via JSAPI1_CurrentTitleChanged()
- if (!app_name || app_name && !*app_name || (unsigned int)(ULONG_PTR)app_name < 65536) BuildAppName();
- set_caption(0, L"%s - %S", (config_dotasknum?FileTitleNum:FileTitle), app_name);
- draw_playicon(1);
- }
- /* -------- Pausing -------- */
- void PausePlaying()
- {
- if (!playing || paused) return ;
- paused = 1;
- in_pause(1);
- Skin_OnPause();
- PostMessageW(hMainWindow, WM_WA_IPC, IPC_CB_MISC_STATUS, IPC_CB_MISC);
- PostMessageW(hMainWindow, WM_WA_IPC, IPC_CB_MISC_PAUSE, IPC_CB_MISC);
-
- MediaCoreCOM *mediaCore;
- if (SUCCEEDED(JSAPI1_GetMediaCoreCOM(&mediaCore)))
- {
- mediaCore->OnPause();
- mediaCore->Release();
- }
- JSAPI2::callbackManager.OnPause(true);
- }
- void UnPausePlaying()
- {
- if (!playing || !paused) return ;
- in_pause(0);
- paused = 0;
- Skin_OnUnpause();
- PostMessageW(hMainWindow, WM_WA_IPC, IPC_CB_MISC_STATUS, IPC_CB_MISC);
- PostMessageW(hMainWindow, WM_WA_IPC, IPC_CB_MISC_UNPAUSE, IPC_CB_MISC);
-
- MediaCoreCOM *mediaCore = 0;
- if (SUCCEEDED(JSAPI1_GetMediaCoreCOM(&mediaCore)) && mediaCore)
- {
- mediaCore->OnResume();
- mediaCore->Release();
- }
- JSAPI2::callbackManager.OnPause(false);
- }
- void PlayThing(const char *thing, int clearlist)
- {
- }
- void BeginPlayback()
- {
- PlayList_setposition(0);
- if (config_shuffle)
- PlayList_randpos( -BIGINT);
- PlayList_getcurrent(FileName, FileTitle, FileTitleNum);
- StartPlaying();
- }
|