Mercurial > mplayer.hg
annotate gui/win32/interface.c @ 33661:b2071e60b20b
Rename guiGetEvent type guiSetAudioOnly guiSetAudio.
(All audio related guiGetEvent() code will be moved here later.)
Additionally, set variable guiInfo.AudioChannels in guiGetEvent()
rather than in mplayer.c. In order to do this, guiSetVideo must come
first, then audio.
author | ib |
---|---|
date | Tue, 28 Jun 2011 08:52:02 +0000 |
parents | 40a5f2faa22c |
children | 0f592e8530f1 |
rev | line source |
---|---|
23077 | 1 /* |
23079 | 2 * MPlayer GUI for Win32 |
3 * Copyright (C) 2003 Sascha Sommer <saschasommer@freenet.de> | |
4 * Copyright (C) 2006 Erik Augustson <erik_27can@yahoo.com> | |
5 * Copyright (C) 2006 Gianluigi Tiesi <sherpya@netfarm.it> | |
6 * | |
7 * This file is part of MPlayer. | |
8 * | |
9 * MPlayer is free software; you can redistribute it and/or modify | |
10 * it under the terms of the GNU General Public License as published by | |
11 * the Free Software Foundation; either version 2 of the License, or | |
12 * (at your option) any later version. | |
13 * | |
14 * MPlayer is distributed in the hope that it will be useful, | |
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
17 * GNU General Public License for more details. | |
18 * | |
26457 | 19 * You should have received a copy of the GNU General Public License along |
20 * with MPlayer; if not, write to the Free Software Foundation, Inc., | |
21 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |
23079 | 22 */ |
23077 | 23 |
24 #include <windows.h> | |
33358 | 25 |
26 #if defined(__CYGWIN__) | |
27 #define _beginthreadex CreateThread | |
28 #else | |
29 #include <process.h> | |
30 #endif | |
31 | |
30901 | 32 #include "path.h" |
26372
76413880bfad
Update include paths to account for build system changes.
diego
parents:
26193
diff
changeset
|
33 #include "gui/interface.h" |
23091
52488bb09d90
Consistently use quotes instead of angled brackets in #include
diego
parents:
23079
diff
changeset
|
34 #include "m_option.h" |
52488bb09d90
Consistently use quotes instead of angled brackets in #include
diego
parents:
23079
diff
changeset
|
35 #include "mixer.h" |
52488bb09d90
Consistently use quotes instead of angled brackets in #include
diego
parents:
23079
diff
changeset
|
36 #include "mp_msg.h" |
52488bb09d90
Consistently use quotes instead of angled brackets in #include
diego
parents:
23079
diff
changeset
|
37 #include "help_mp.h" |
52488bb09d90
Consistently use quotes instead of angled brackets in #include
diego
parents:
23079
diff
changeset
|
38 #include "codec-cfg.h" |
52488bb09d90
Consistently use quotes instead of angled brackets in #include
diego
parents:
23079
diff
changeset
|
39 #include "stream/stream.h" |
52488bb09d90
Consistently use quotes instead of angled brackets in #include
diego
parents:
23079
diff
changeset
|
40 #include "libmpdemux/demuxer.h" |
52488bb09d90
Consistently use quotes instead of angled brackets in #include
diego
parents:
23079
diff
changeset
|
41 #include "libmpdemux/stheader.h" |
27341
e7c989f7a7c9
Start unifying names of internal preprocessor directives.
diego
parents:
26457
diff
changeset
|
42 #ifdef CONFIG_DVDREAD |
23091
52488bb09d90
Consistently use quotes instead of angled brackets in #include
diego
parents:
23079
diff
changeset
|
43 #include "stream/stream_dvd.h" |
23077 | 44 #endif |
23091
52488bb09d90
Consistently use quotes instead of angled brackets in #include
diego
parents:
23079
diff
changeset
|
45 #include "input/input.h" |
52488bb09d90
Consistently use quotes instead of angled brackets in #include
diego
parents:
23079
diff
changeset
|
46 #include "libvo/video_out.h" |
52488bb09d90
Consistently use quotes instead of angled brackets in #include
diego
parents:
23079
diff
changeset
|
47 #include "libao2/audio_out.h" |
52488bb09d90
Consistently use quotes instead of angled brackets in #include
diego
parents:
23079
diff
changeset
|
48 #include "access_mpcontext.h" |
30558 | 49 #include "libmpcodecs/vd.h" |
31425
2392ad3cec9c
Move af_cfg extern variable declaration to dec_audio.h.
diego
parents:
31312
diff
changeset
|
50 #include "libmpcodecs/dec_audio.h" |
33557 | 51 #include "gui/ui/gmplayer.h" |
30558 | 52 #include "mp_core.h" |
32093 | 53 #include "mpcommon.h" |
23077 | 54 #include "gui.h" |
55 #include "dialogs.h" | |
27391
1d2faa1020fb
Rename a bunch of miscellaneous preprocessor directives.
diego
parents:
27341
diff
changeset
|
56 #ifdef CONFIG_LIBCDIO |
23077 | 57 #include <cdio/cdio.h> |
58 #endif | |
59 | |
60 int guiWinID = 0; | |
61 | |
62 char *skinName = NULL; | |
63 char *codecname = NULL; | |
33555 | 64 int uiGotoTheNext = 1; |
23077 | 65 static gui_t *mygui = NULL; |
66 static int update_subwindow(void); | |
67 static RECT old_rect; | |
68 static DWORD style; | |
24992 | 69 static HANDLE hThread; |
70 static unsigned threadId; | |
25765
304fc0bbefe1
audio_out / video_out structs should be treated as const
reimar
parents:
24992
diff
changeset
|
71 const ao_functions_t *audio_out = NULL; |
304fc0bbefe1
audio_out / video_out structs should be treated as const
reimar
parents:
24992
diff
changeset
|
72 const vo_functions_t *video_out = NULL; |
23077 | 73 mixer_t *mixer = NULL; |
74 | |
75 /* test for playlist files, no need to specify -playlist on the commandline. | |
76 * add any conceivable playlist extensions here. | |
77 * - Erik | |
78 */ | |
79 int parse_filename(char *file, play_tree_t *playtree, m_config_t *mconfig, int clear) | |
80 { | |
81 if(clear) | |
82 mygui->playlist->clear_playlist(mygui->playlist); | |
83 | |
84 if(strstr(file, ".m3u") || strstr(file, ".pls")) | |
85 { | |
86 playtree = parse_playlist_file(file); | |
87 import_playtree_playlist_into_gui(playtree, mconfig); | |
88 return 1; | |
89 } | |
90 return 0; | |
91 } | |
92 | |
93 /** | |
94 * \brief this actually creates a new list containing only one element... | |
95 */ | |
96 void gaddlist( char ***list, const char *entry) | |
97 { | |
98 int i; | |
99 | |
100 if (*list) | |
101 { | |
102 for (i=0; (*list)[i]; i++) free((*list)[i]); | |
103 free(*list); | |
104 } | |
105 | |
106 *list = malloc(2 * sizeof(char **)); | |
107 (*list)[0] = gstrdup(entry); | |
108 (*list)[1] = NULL; | |
109 } | |
110 | |
111 char *gstrdup(const char *str) | |
112 { | |
113 if (!str) return NULL; | |
114 return strdup(str); | |
115 } | |
116 | |
117 /** | |
118 * \brief this replaces a string starting with search by replace. | |
119 * If not found, replace is appended. | |
120 */ | |
33579 | 121 static void greplace(char ***list, char *search, char *replace) |
23077 | 122 { |
123 int i = 0; | |
124 int len = (search) ? strlen(search) : 0; | |
125 | |
126 if (*list) | |
127 { | |
128 for (i = 0; (*list)[i]; i++) | |
129 { | |
130 if (search && (!strncmp((*list)[i], search, len))) | |
131 { | |
132 free((*list)[i]); | |
133 (*list)[i] = gstrdup(replace); | |
134 return; | |
135 } | |
136 } | |
137 *list = realloc(*list, (i + 2) * sizeof(char *)); | |
138 } | |
139 else | |
140 *list = malloc(2 * sizeof(char *)); | |
141 | |
142 (*list)[i] = gstrdup(replace); | |
143 (*list)[i + 1] = NULL; | |
144 } | |
145 | |
146 /* this function gets called by the gui to update mplayer */ | |
147 static void guiSetEvent(int event) | |
148 { | |
33555 | 149 if(guiInfo.mpcontext) |
150 mixer = mpctx_get_mixer(guiInfo.mpcontext); | |
23077 | 151 |
152 switch(event) | |
153 { | |
154 case evPlay: | |
155 case evPlaySwitchToPause: | |
23148
71efd1fc20c8
add missing case value, fixes functionality when using some skins.
vayne
parents:
23147
diff
changeset
|
156 case evPauseSwitchToPlay: |
33555 | 157 uiPlay(); |
23077 | 158 break; |
159 case evPause: | |
33555 | 160 uiPause(); |
23077 | 161 break; |
27341
e7c989f7a7c9
Start unifying names of internal preprocessor directives.
diego
parents:
26457
diff
changeset
|
162 #ifdef CONFIG_DVDREAD |
23077 | 163 case evPlayDVD: |
164 { | |
165 static char dvdname[MAX_PATH]; | |
33555 | 166 guiInfo.DVD.current_title = dvd_title; |
167 guiInfo.DVD.current_chapter = dvd_chapter; | |
168 guiInfo.DVD.current_angle = dvd_angle; | |
169 guiInfo.DiskChanged = 1; | |
23077 | 170 |
33555 | 171 uiSetFileName(NULL, dvd_device, STREAMTYPE_DVD); |
23077 | 172 dvdname[0] = 0; |
173 strcat(dvdname, "DVD Movie"); | |
174 GetVolumeInformation(dvd_device, dvdname, MAX_PATH, NULL, NULL, NULL, NULL, 0); | |
175 capitalize(dvdname); | |
176 mp_msg(MSGT_GPLAYER, MSGL_V, "Opening DVD %s -> %s\n", dvd_device, dvdname); | |
33658
3a617d41751a
Rename guiGetEvent type guiSetParameters guiPreparation.
ib
parents:
33657
diff
changeset
|
177 guiGetEvent(guiPreparation, (void *) STREAMTYPE_DVD); |
23077 | 178 mygui->playlist->clear_playlist(mygui->playlist); |
179 mygui->playlist->add_track(mygui->playlist, filename, NULL, dvdname, 0); | |
180 mygui->startplay(mygui); | |
181 break; | |
182 } | |
183 #endif | |
27391
1d2faa1020fb
Rename a bunch of miscellaneous preprocessor directives.
diego
parents:
27341
diff
changeset
|
184 #ifdef CONFIG_LIBCDIO |
23077 | 185 case evPlayCD: |
186 { | |
187 int i; | |
188 char track[10]; | |
189 char trackname[10]; | |
190 CdIo_t *p_cdio = cdio_open(NULL, DRIVER_UNKNOWN); | |
191 track_t i_tracks; | |
192 | |
193 if(p_cdio == NULL) printf("Couldn't find a driver.\n"); | |
194 i_tracks = cdio_get_num_tracks(p_cdio); | |
195 | |
196 mygui->playlist->clear_playlist(mygui->playlist); | |
197 for(i=0;i<i_tracks;i++) | |
198 { | |
199 sprintf(track, "cdda://%d", i+1); | |
200 sprintf(trackname, "Track %d", i+1); | |
201 mygui->playlist->add_track(mygui->playlist, track, NULL, trackname, 0); | |
202 } | |
203 cdio_destroy(p_cdio); | |
204 mygui->startplay(mygui); | |
205 break; | |
206 } | |
207 #endif | |
208 case evFullScreen: | |
209 mp_input_queue_cmd(mp_input_parse_cmd("vo_fullscreen")); | |
210 break; | |
211 case evExit: | |
212 { | |
213 /* We are asking mplayer to exit, later it will ask us after uninit is made | |
214 this should be the only safe way to quit */ | |
215 mygui->activewidget = NULL; | |
216 mp_input_queue_cmd(mp_input_parse_cmd("quit")); | |
217 break; | |
218 } | |
219 case evStop: | |
33555 | 220 if(guiInfo.Playing) |
33614 | 221 guiGetEvent(guiSetState, (void *) GUI_STOP); |
23077 | 222 break; |
223 case evSetMoviePosition: | |
224 { | |
33555 | 225 rel_seek_secs = guiInfo.Position / 100.0f; |
23077 | 226 abs_seek_pos = 3; |
227 break; | |
228 } | |
229 case evForward10sec: | |
230 { | |
231 rel_seek_secs = 10.0f; | |
232 abs_seek_pos = 0; | |
233 break; | |
234 } | |
235 case evBackward10sec: | |
236 { | |
237 rel_seek_secs = -10.0f; | |
238 abs_seek_pos = 0; | |
239 break; | |
240 } | |
241 case evSetBalance: | |
242 case evSetVolume: | |
243 { | |
244 float l,r; | |
245 | |
33615
1f9a31d4f114
Replace all playback integer constants by their symbolic constants.
ib
parents:
33614
diff
changeset
|
246 if (guiInfo.Playing == GUI_STOP) |
23077 | 247 break; |
248 | |
33555 | 249 if (guiInfo.Balance == 50.0f) |
250 mixer_setvolume(mixer, guiInfo.Volume, guiInfo.Volume); | |
23077 | 251 |
33555 | 252 l = guiInfo.Volume * ((100.0f - guiInfo.Balance) / 50.0f); |
253 r = guiInfo.Volume * ((guiInfo.Balance) / 50.0f); | |
23077 | 254 |
33555 | 255 if (l > guiInfo.Volume) l=guiInfo.Volume; |
256 if (r > guiInfo.Volume) r=guiInfo.Volume; | |
23077 | 257 mixer_setvolume(mixer, l, r); |
258 /* Check for balance support on mixer - there is a better way ?? */ | |
259 if (r != l) | |
260 { | |
261 mixer_getvolume(mixer, &l, &r); | |
262 if (r == l) | |
263 { | |
264 mp_msg(MSGT_GPLAYER, MSGL_V, "[GUI] Mixer doesn't support balanced audio\n"); | |
33555 | 265 mixer_setvolume(mixer, guiInfo.Volume, guiInfo.Volume); |
266 guiInfo.Balance = 50.0f; | |
23077 | 267 } |
268 } | |
269 break; | |
270 } | |
271 case evMute: | |
272 { | |
273 mp_cmd_t * cmd = calloc(1, sizeof(*cmd)); | |
274 cmd->id=MP_CMD_MUTE; | |
275 cmd->name=strdup("mute"); | |
276 mp_input_queue_cmd(cmd); | |
277 break; | |
278 } | |
279 case evDropFile: | |
280 case evLoadPlay: | |
281 { | |
33555 | 282 switch(guiInfo.StreamType) |
23077 | 283 { |
27341
e7c989f7a7c9
Start unifying names of internal preprocessor directives.
diego
parents:
26457
diff
changeset
|
284 #ifdef CONFIG_DVDREAD |
23077 | 285 case STREAMTYPE_DVD: |
286 { | |
33555 | 287 guiInfo.Title = guiInfo.DVD.current_title; |
288 guiInfo.Chapter = guiInfo.DVD.current_chapter; | |
289 guiInfo.Angle = guiInfo.DVD.current_angle; | |
290 guiInfo.DiskChanged = 1; | |
33614 | 291 guiGetEvent(guiSetState, (void *) GUI_PLAY); |
23077 | 292 break; |
293 } | |
23147
21c35763b178
compilation fix for disabling dvd functionality, patch by <bangbangbear at gmail dot com>, slightly modified by me.
vayne
parents:
23123
diff
changeset
|
294 #endif |
23077 | 295 default: |
296 { | |
33555 | 297 guiInfo.FilenameChanged = guiInfo.NewPlay = 1; |
23077 | 298 update_playlistwindow(); |
33555 | 299 uiGotoTheNext = guiInfo.Playing? 0 : 1; |
33614 | 300 guiGetEvent(guiSetState, (void *) GUI_STOP); |
301 guiGetEvent(guiSetState, (void *) GUI_PLAY); | |
23077 | 302 break; |
303 } | |
304 } | |
305 break; | |
306 } | |
307 case evNext: | |
33555 | 308 uiNext(); |
23077 | 309 break; |
310 case evPrev: | |
33555 | 311 uiPrev(); |
23077 | 312 break; |
313 } | |
314 } | |
315 | |
33555 | 316 void uiPlay( void ) |
23077 | 317 { |
33555 | 318 if((!guiInfo.Filename ) || (guiInfo.Filename[0] == 0)) |
23077 | 319 return; |
320 | |
33615
1f9a31d4f114
Replace all playback integer constants by their symbolic constants.
ib
parents:
33614
diff
changeset
|
321 if(guiInfo.Playing > GUI_STOP) |
23077 | 322 { |
33555 | 323 uiPause(); |
23077 | 324 return; |
325 } | |
33555 | 326 guiInfo.NewPlay = 1; |
33614 | 327 guiGetEvent(guiSetState, (void *) GUI_PLAY); |
23077 | 328 } |
329 | |
33555 | 330 void uiPause( void ) |
23077 | 331 { |
33555 | 332 if(!guiInfo.Playing) return; |
23077 | 333 |
33615
1f9a31d4f114
Replace all playback integer constants by their symbolic constants.
ib
parents:
33614
diff
changeset
|
334 if(guiInfo.Playing == GUI_PLAY) |
23077 | 335 { |
336 mp_cmd_t * cmd = calloc(1, sizeof(*cmd)); | |
337 cmd->id=MP_CMD_PAUSE; | |
338 cmd->name=strdup("pause"); | |
339 mp_input_queue_cmd(cmd); | |
33615
1f9a31d4f114
Replace all playback integer constants by their symbolic constants.
ib
parents:
33614
diff
changeset
|
340 } else guiInfo.Playing = GUI_PLAY; |
23077 | 341 } |
342 | |
33555 | 343 void uiNext(void) |
23077 | 344 { |
33615
1f9a31d4f114
Replace all playback integer constants by their symbolic constants.
ib
parents:
33614
diff
changeset
|
345 if(guiInfo.Playing == GUI_PAUSE) return; |
33555 | 346 switch(guiInfo.StreamType) |
23077 | 347 { |
27341
e7c989f7a7c9
Start unifying names of internal preprocessor directives.
diego
parents:
26457
diff
changeset
|
348 #ifdef CONFIG_DVDREAD |
23077 | 349 case STREAMTYPE_DVD: |
33555 | 350 if(guiInfo.DVD.current_chapter == (guiInfo.DVD.chapters - 1)) |
23077 | 351 return; |
33555 | 352 guiInfo.DVD.current_chapter++; |
23077 | 353 break; |
354 #endif | |
355 default: | |
356 if(mygui->playlist->current == (mygui->playlist->trackcount - 1)) | |
357 return; | |
33555 | 358 uiSetFileName(NULL, mygui->playlist->tracks[(mygui->playlist->current)++]->filename, |
23077 | 359 STREAMTYPE_STREAM); |
360 break; | |
361 } | |
362 mygui->startplay(mygui); | |
363 } | |
364 | |
33555 | 365 void uiPrev(void) |
23077 | 366 { |
33615
1f9a31d4f114
Replace all playback integer constants by their symbolic constants.
ib
parents:
33614
diff
changeset
|
367 if(guiInfo.Playing == GUI_PAUSE) return; |
33555 | 368 switch(guiInfo.StreamType) |
23077 | 369 { |
27341
e7c989f7a7c9
Start unifying names of internal preprocessor directives.
diego
parents:
26457
diff
changeset
|
370 #ifdef CONFIG_DVDREAD |
23077 | 371 case STREAMTYPE_DVD: |
33555 | 372 if(guiInfo.DVD.current_chapter == 1) |
23077 | 373 return; |
33555 | 374 guiInfo.DVD.current_chapter--; |
23077 | 375 break; |
376 #endif | |
377 default: | |
378 if(mygui->playlist->current == 0) | |
379 return; | |
33555 | 380 uiSetFileName(NULL, mygui->playlist->tracks[(mygui->playlist->current)--]->filename, |
23077 | 381 STREAMTYPE_STREAM); |
382 break; | |
383 } | |
384 mygui->startplay(mygui); | |
385 } | |
386 | |
33555 | 387 void uiEnd( void ) |
23077 | 388 { |
33555 | 389 if(!uiGotoTheNext && guiInfo.Playing) |
23077 | 390 { |
33555 | 391 uiGotoTheNext = 1; |
23077 | 392 return; |
393 } | |
394 | |
33555 | 395 if(uiGotoTheNext && guiInfo.Playing && |
23077 | 396 (mygui->playlist->current < (mygui->playlist->trackcount - 1)) && |
33555 | 397 guiInfo.StreamType != STREAMTYPE_DVD && |
398 guiInfo.StreamType != STREAMTYPE_DVDNAV) | |
23077 | 399 { |
400 /* we've finished this file, reset the aspect */ | |
401 if(movie_aspect >= 0) | |
402 movie_aspect = -1; | |
403 | |
33555 | 404 uiGotoTheNext = guiInfo.FilenameChanged = guiInfo.NewPlay = 1; |
405 uiSetFileName(NULL, mygui->playlist->tracks[(mygui->playlist->current)++]->filename, STREAMTYPE_STREAM); | |
406 //sprintf(guiInfo.Filename, mygui->playlist->tracks[(mygui->playlist->current)++]->filename); | |
23077 | 407 } |
408 | |
33555 | 409 if(guiInfo.FilenameChanged && guiInfo.NewPlay) |
23077 | 410 return; |
411 | |
33555 | 412 guiInfo.TimeSec = 0; |
413 guiInfo.Position = 0; | |
33646 | 414 guiInfo.AudioChannels = 0; |
23077 | 415 |
27341
e7c989f7a7c9
Start unifying names of internal preprocessor directives.
diego
parents:
26457
diff
changeset
|
416 #ifdef CONFIG_DVDREAD |
33555 | 417 guiInfo.DVD.current_title = 1; |
418 guiInfo.DVD.current_chapter = 1; | |
419 guiInfo.DVD.current_angle = 1; | |
23077 | 420 #endif |
421 | |
422 if (mygui->playlist->current == (mygui->playlist->trackcount - 1)) | |
423 mygui->playlist->current = 0; | |
424 | |
425 fullscreen = 0; | |
426 if(style == WS_VISIBLE | WS_POPUP) | |
427 { | |
428 style = WS_OVERLAPPEDWINDOW | WS_SIZEBOX; | |
429 SetWindowLong(mygui->subwindow, GWL_STYLE, style); | |
430 } | |
33614 | 431 guiGetEvent(guiSetState, (void *) GUI_STOP); |
23077 | 432 } |
433 | |
33578 | 434 void uiStop(void) |
33567 | 435 { |
33614 | 436 guiGetEvent(guiSetState, (void *) GUI_STOP); |
33567 | 437 } |
438 | |
33555 | 439 void uiSetFileName(char *dir, char *name, int type) |
23077 | 440 { |
441 if(!name) return; | |
442 if(!dir) | |
33555 | 443 guiSetFilename(guiInfo.Filename, name) |
23077 | 444 else |
33555 | 445 guiSetDF(guiInfo.Filename, dir, name); |
23077 | 446 |
33555 | 447 guiInfo.StreamType = type; |
448 free(guiInfo.AudioFile); | |
449 guiInfo.AudioFile = NULL; | |
450 free(guiInfo.Subtitlename); | |
451 guiInfo.Subtitlename = NULL; | |
23077 | 452 } |
453 | |
33555 | 454 void uiFullScreen( void ) |
23077 | 455 { |
33555 | 456 if(!guiInfo.sh_video) return; |
23077 | 457 |
458 if(sub_window) | |
459 { | |
460 if(!fullscreen && IsWindowVisible(mygui->subwindow) && !IsIconic(mygui->subwindow)) | |
461 GetWindowRect(mygui->subwindow, &old_rect); | |
462 | |
463 if(fullscreen) | |
464 { | |
465 fullscreen = 0; | |
466 style = WS_OVERLAPPEDWINDOW | WS_SIZEBOX; | |
467 } else { | |
468 fullscreen = 1; | |
469 style = WS_VISIBLE | WS_POPUP; | |
470 } | |
471 SetWindowLong(mygui->subwindow, GWL_STYLE, style); | |
472 update_subwindow(); | |
473 } | |
474 video_out->control(VOCTRL_FULLSCREEN, 0); | |
475 if(sub_window) ShowWindow(mygui->subwindow, SW_SHOW); | |
476 } | |
477 | |
24992 | 478 static unsigned __stdcall GuiThread(void* param) |
23077 | 479 { |
480 MSG msg; | |
481 | |
482 if(!skinName) skinName = strdup("Blue"); | |
483 if(!mygui) mygui = create_gui(get_path("skins"), skinName, guiSetEvent); | |
30558 | 484 if(!mygui) exit_player(EXIT_ERROR); |
23077 | 485 |
486 if(autosync && autosync != gtkAutoSync) | |
487 { | |
488 gtkAutoSyncOn = 1; | |
489 gtkAutoSync = autosync; | |
490 } | |
491 | |
24992 | 492 while(GetMessage(&msg, NULL, 0, 0)) |
23077 | 493 { |
494 TranslateMessage(&msg); | |
495 DispatchMessage(&msg); | |
496 } | |
23078 | 497 fprintf(stderr, "[GUI] GUI thread terminated.\n"); |
23077 | 498 fflush(stderr); |
499 return 0; | |
500 } | |
501 | |
502 void guiInit(void) | |
503 { | |
33555 | 504 memset(&guiInfo, 0, sizeof(guiInfo)); |
23077 | 505 /* Create The gui thread */ |
506 if (!mygui) | |
507 { | |
33358 | 508 hThread = _beginthreadex(NULL, 0, GuiThread, NULL, 0, &threadId); |
23077 | 509 mp_msg(MSGT_GPLAYER, MSGL_V, "[GUI] Creating GUI Thread 0x%04x\n", threadId); |
510 } | |
511 | |
512 /* Wait until the gui is created */ | |
513 while(!mygui) Sleep(100); | |
23078 | 514 mp_msg(MSGT_GPLAYER, MSGL_V, "[GUI] GUI thread started.\n"); |
23077 | 515 } |
516 | |
517 void guiDone(void) | |
518 { | |
519 if(mygui) | |
520 { | |
521 fprintf(stderr, "[GUI] Closed by main mplayer window\n"); | |
522 fflush(stderr); | |
24992 | 523 PostThreadMessage(threadId, WM_QUIT, 0, 0); |
524 WaitForSingleObject(hThread, INFINITE); | |
525 CloseHandle(hThread); | |
23077 | 526 mygui->uninit(mygui); |
527 free(mygui); | |
528 mygui = NULL; | |
529 } | |
530 /* Remove tray icon */ | |
531 Shell_NotifyIcon(NIM_DELETE, &nid); | |
532 cfg_write(); | |
533 } | |
534 | |
535 /* this function gets called by mplayer to update the gui */ | |
30722
b0342ca7ea61
Fix windows Gui compilation and remove some related typecasts.
reimar
parents:
30558
diff
changeset
|
536 int guiGetEvent(int type, void *arg) |
23077 | 537 { |
30722
b0342ca7ea61
Fix windows Gui compilation and remove some related typecasts.
reimar
parents:
30558
diff
changeset
|
538 stream_t *stream = arg; |
27341
e7c989f7a7c9
Start unifying names of internal preprocessor directives.
diego
parents:
26457
diff
changeset
|
539 #ifdef CONFIG_DVDREAD |
30722
b0342ca7ea61
Fix windows Gui compilation and remove some related typecasts.
reimar
parents:
30558
diff
changeset
|
540 dvd_priv_t *dvdp = arg; |
23077 | 541 #endif |
542 if(!mygui || !mygui->skin) return 0; | |
543 | |
33555 | 544 if(guiInfo.mpcontext) |
23077 | 545 { |
33555 | 546 audio_out = mpctx_get_audio_out(guiInfo.mpcontext); |
547 video_out = mpctx_get_video_out(guiInfo.mpcontext); | |
548 mixer = mpctx_get_mixer(guiInfo.mpcontext); | |
549 playtree = mpctx_get_playtree_iter(guiInfo.mpcontext); | |
23077 | 550 } |
551 | |
552 switch (type) | |
553 { | |
33658
3a617d41751a
Rename guiGetEvent type guiSetParameters guiPreparation.
ib
parents:
33657
diff
changeset
|
554 case guiPreparation: |
23077 | 555 { |
556 guiGetEvent(guiSetDefaults, NULL); | |
33555 | 557 guiInfo.DiskChanged = 0; |
558 guiInfo.FilenameChanged = 0; | |
559 guiInfo.NewPlay = 0; | |
560 switch(guiInfo.StreamType) | |
23077 | 561 { |
562 case STREAMTYPE_PLAYLIST: | |
563 break; | |
27341
e7c989f7a7c9
Start unifying names of internal preprocessor directives.
diego
parents:
26457
diff
changeset
|
564 #ifdef CONFIG_DVDREAD |
23077 | 565 case STREAMTYPE_DVD: |
566 { | |
567 char tmp[512]; | |
33555 | 568 dvd_title = guiInfo.DVD.current_title; |
569 dvd_chapter = guiInfo.DVD.current_chapter; | |
570 dvd_angle = guiInfo.DVD.current_angle; | |
571 sprintf(tmp,"dvd://%d", guiInfo.Title); | |
572 guiSetFilename(guiInfo.Filename, tmp); | |
23077 | 573 break; |
574 } | |
575 #endif | |
576 } | |
33555 | 577 if(guiInfo.Filename) |
578 filename = strdup(guiInfo.Filename); | |
23077 | 579 else if(filename) |
33555 | 580 strcpy(guiInfo.Filename, filename); |
23077 | 581 break; |
582 } | |
33661 | 583 case guiSetAudio: |
23077 | 584 { |
33661 | 585 // NOTE: This type doesn't mean (and never meant) that we have |
586 // *just* audio, so there probably should be a check before | |
587 // hiding (see gui/interface.c). | |
23077 | 588 if(IsWindowVisible(mygui->subwindow)) |
589 ShowWindow(mygui->subwindow, SW_HIDE); | |
590 break; | |
591 } | |
592 case guiSetContext: | |
33555 | 593 guiInfo.mpcontext = arg; |
23077 | 594 break; |
33660 | 595 case guiSetVideo: |
23077 | 596 { |
33555 | 597 guiInfo.sh_video = arg; |
23077 | 598 if (arg) |
599 { | |
30722
b0342ca7ea61
Fix windows Gui compilation and remove some related typecasts.
reimar
parents:
30558
diff
changeset
|
600 sh_video_t *sh = arg; |
23077 | 601 codecname = sh->codec->name; |
33555 | 602 guiInfo.FPS = sh->fps; |
23077 | 603 |
604 /* we have video, show the subwindow */ | |
605 if(!IsWindowVisible(mygui->subwindow) || IsIconic(mygui->subwindow)) | |
606 ShowWindow(mygui->subwindow, SW_SHOWNORMAL); | |
607 if(WinID == -1) | |
608 update_subwindow(); | |
609 | |
610 } | |
611 break; | |
612 } | |
33653
86819da22c57
Rename guiGetEvent type guiSetVideo guiSetVideoWindow.
ib
parents:
33651
diff
changeset
|
613 case guiSetVideoWindow: |
23077 | 614 { |
33555 | 615 guiInfo.MovieWidth = vo_dwidth; |
616 guiInfo.MovieHeight = vo_dheight; | |
23077 | 617 |
33555 | 618 sub_aspect = (float)guiInfo.MovieWidth/guiInfo.MovieHeight; |
23077 | 619 if(WinID != -1) |
620 update_subwindow(); | |
621 break; | |
622 } | |
623 case guiSetStream: | |
624 { | |
33555 | 625 guiInfo.StreamType = stream->type; |
23077 | 626 switch(stream->type) |
627 { | |
27341
e7c989f7a7c9
Start unifying names of internal preprocessor directives.
diego
parents:
26457
diff
changeset
|
628 #ifdef CONFIG_DVDREAD |
23077 | 629 case STREAMTYPE_DVD: |
33595 | 630 guiGetEvent(guiSetDVD, stream->priv); |
23077 | 631 break; |
632 #endif | |
633 } | |
634 break; | |
635 } | |
27341
e7c989f7a7c9
Start unifying names of internal preprocessor directives.
diego
parents:
26457
diff
changeset
|
636 #ifdef CONFIG_DVDREAD |
23077 | 637 case guiSetDVD: |
638 { | |
33555 | 639 guiInfo.DVD.titles = dvdp->vmg_file->tt_srpt->nr_of_srpts; |
640 guiInfo.DVD.chapters = dvdp->vmg_file->tt_srpt->title[dvd_title].nr_of_ptts; | |
641 guiInfo.DVD.angles = dvdp->vmg_file->tt_srpt->title[dvd_title].nr_of_angles; | |
642 guiInfo.DVD.nr_of_audio_channels = dvdp->nr_of_channels; | |
643 memcpy(guiInfo.DVD.audio_streams, dvdp->audio_streams, sizeof(dvdp->audio_streams)); | |
644 guiInfo.DVD.nr_of_subtitles = dvdp->nr_of_subtitles; | |
645 memcpy(guiInfo.DVD.subtitles, dvdp->subtitles, sizeof(dvdp->subtitles)); | |
646 guiInfo.DVD.current_title = dvd_title + 1; | |
647 guiInfo.DVD.current_chapter = dvd_chapter + 1; | |
648 guiInfo.DVD.current_angle = dvd_angle + 1; | |
649 guiInfo.Track = dvd_title + 1; | |
23077 | 650 break; |
651 } | |
652 #endif | |
653 case guiReDraw: | |
654 mygui->updatedisplay(mygui, mygui->mainwindow); | |
655 break; | |
656 case guiSetAfilter: | |
33555 | 657 guiInfo.afilter = arg; |
23077 | 658 break; |
33611 | 659 case guiSetState: |
23077 | 660 { |
33555 | 661 guiInfo.Playing = (int) arg; |
662 switch (guiInfo.Playing) | |
23077 | 663 { |
33614 | 664 case GUI_PLAY: |
23077 | 665 { |
33615
1f9a31d4f114
Replace all playback integer constants by their symbolic constants.
ib
parents:
33614
diff
changeset
|
666 guiInfo.Playing = GUI_PLAY; |
23077 | 667 break; |
668 } | |
33614 | 669 case GUI_STOP: |
23077 | 670 { |
33615
1f9a31d4f114
Replace all playback integer constants by their symbolic constants.
ib
parents:
33614
diff
changeset
|
671 guiInfo.Playing = GUI_STOP; |
23077 | 672 if(movie_aspect >= 0) |
673 movie_aspect = -1; | |
674 update_subwindow(); | |
675 break; | |
676 } | |
33614 | 677 case GUI_PAUSE: |
33615
1f9a31d4f114
Replace all playback integer constants by their symbolic constants.
ib
parents:
33614
diff
changeset
|
678 guiInfo.Playing = GUI_PAUSE; |
23077 | 679 break; |
680 } | |
681 break; | |
682 } | |
33659 | 683 case guiRunCommand: |
23077 | 684 { |
685 mp_msg(MSGT_GPLAYER,MSGL_V, "cmd: %d\n", (int) arg); | |
686 /* MPlayer asks us to quit */ | |
687 switch((int) arg) | |
688 { | |
31312
0b7792622c88
Remove Gui-specific slave commands and associated key-bindings and other code.
reimar
parents:
30901
diff
changeset
|
689 case MP_CMD_VO_FULLSCREEN: |
33555 | 690 uiFullScreen(); |
23077 | 691 break; |
692 case MP_CMD_QUIT: | |
693 { | |
694 mygui->uninit(mygui); | |
695 free(mygui); | |
696 mygui = NULL; | |
30558 | 697 exit_player(EXIT_QUIT); |
23077 | 698 return 0; |
699 } | |
700 default: | |
701 break; | |
702 } | |
703 break; | |
704 } | |
705 case guiSetFileName: | |
33555 | 706 if (arg) guiInfo.Filename = arg; |
23077 | 707 break; |
708 case guiSetDefaults: | |
709 { | |
710 audio_id = -1; | |
711 video_id = -1; | |
712 dvdsub_id = -1; | |
713 vobsub_id = -1; | |
714 stream_cache_size = -1; | |
715 autosync = 0; | |
716 dvd_title = 0; | |
717 force_fps = 0; | |
718 if(!mygui->playlist->tracks) return 0; | |
33555 | 719 filename = guiInfo.Filename = mygui->playlist->tracks[mygui->playlist->current]->filename; |
720 guiInfo.Track = mygui->playlist->current + 1; | |
23077 | 721 if(gtkAONorm) greplace(&af_cfg.list, "volnorm", "volnorm"); |
722 if(gtkAOExtraStereo) | |
723 { | |
724 char *name = malloc(12 + 20 + 1); | |
725 snprintf(name, 12 + 20, "extrastereo=%f", gtkAOExtraStereoMul); | |
726 name[12 + 20] = 0; | |
727 greplace(&af_cfg.list, "extrastereo", name); | |
728 free(name); | |
729 } | |
730 if(gtkCacheOn) stream_cache_size = gtkCacheSize; | |
731 if(gtkAutoSyncOn) autosync = gtkAutoSync; | |
732 break; | |
733 } | |
734 case guiSetVolume: | |
735 { | |
736 if(audio_out) | |
737 { | |
738 /* Some audio_out drivers do not support balance e.g. dsound */ | |
739 /* FIXME this algo is not correct */ | |
740 float l, r; | |
741 mixer_getvolume(mixer, &l, &r); | |
33555 | 742 guiInfo.Volume = (r > l ? r : l); /* max(r,l) */ |
23077 | 743 if (r != l) |
33555 | 744 guiInfo.Balance = ((r-l) + 100.0f) * 0.5f; |
23077 | 745 else |
33555 | 746 guiInfo.Balance = 50.0f; |
23077 | 747 } |
748 break; | |
749 } | |
750 default: | |
751 mp_msg(MSGT_GPLAYER, MSGL_ERR, "[GUI] GOT UNHANDLED EVENT %i\n", type); | |
752 } | |
753 return 0; | |
754 } | |
755 | |
756 /* This function adds/inserts one file into the gui playlist */ | |
33579 | 757 static int import_file_into_gui(char *pathname, int insert) |
23077 | 758 { |
759 char filename[MAX_PATH]; | |
760 char *filepart = filename; | |
761 | |
762 if (strstr(pathname, "://")) | |
763 { | |
764 mp_msg(MSGT_GPLAYER, MSGL_V, "[GUI] Adding special %s\n", pathname); | |
765 mygui->playlist->add_track(mygui->playlist, pathname, NULL, NULL, 0); | |
766 return 1; | |
767 } | |
768 if (GetFullPathName(pathname, MAX_PATH, filename, &filepart)) | |
769 { | |
770 if (!(GetFileAttributes(filename) & FILE_ATTRIBUTE_DIRECTORY)) | |
771 { | |
772 mp_msg(MSGT_GPLAYER, MSGL_V, "[GUI] Adding filename: %s - fullpath: %s\n", filepart, filename); | |
773 mygui->playlist->add_track(mygui->playlist, filename, NULL, filepart, 0); | |
774 return 1; | |
775 } | |
776 else | |
777 mp_msg(MSGT_GPLAYER, MSGL_V, "[GUI] Cannot add %s\n", filename); | |
778 } | |
779 | |
780 return 0; | |
781 } | |
782 | |
783 /* This function imports the initial playtree (based on cmd-line files) into the gui playlist | |
784 by either: | |
785 - overwriting gui pl (enqueue=0) */ | |
786 | |
787 int import_initial_playtree_into_gui(play_tree_t *my_playtree, m_config_t *config, int enqueue) | |
788 { | |
789 play_tree_iter_t *my_pt_iter = NULL; | |
790 int result = 0; | |
791 | |
792 if(!mygui) guiInit(); | |
793 | |
794 if((my_pt_iter = pt_iter_create(&my_playtree, config))) | |
795 { | |
796 while ((filename = pt_iter_get_next_file(my_pt_iter)) != NULL) | |
797 { | |
798 if (parse_filename(filename, my_playtree, config, 0)) | |
799 result = 1; | |
800 else if (import_file_into_gui(filename, 0)) /* Add it to end of list */ | |
801 result = 1; | |
802 } | |
803 } | |
33555 | 804 uiGotoTheNext = 1; |
23077 | 805 |
806 if (result) | |
807 { | |
808 mygui->playlist->current = 0; | |
809 filename = mygui->playlist->tracks[0]->filename; | |
810 } | |
811 return result; | |
812 } | |
813 | |
814 /* This function imports and inserts an playtree, that is created "on the fly", for example by | |
815 parsing some MOV-Reference-File; or by loading an playlist with "File Open" | |
816 The file which contained the playlist is thereby replaced with it's contents. */ | |
817 | |
818 int import_playtree_playlist_into_gui(play_tree_t *my_playtree, m_config_t *config) | |
819 { | |
820 play_tree_iter_t *my_pt_iter = NULL; | |
821 int result = 0; | |
822 | |
823 if((my_pt_iter = pt_iter_create(&my_playtree, config))) | |
824 { | |
825 while ((filename = pt_iter_get_next_file(my_pt_iter)) != NULL) | |
826 if (import_file_into_gui(filename, 1)) /* insert it into the list and set plCurrent = new item */ | |
827 result = 1; | |
828 pt_iter_destroy(&my_pt_iter); | |
829 } | |
830 filename = NULL; | |
831 return result; | |
832 } | |
833 | |
33579 | 834 static inline void gtkMessageBox(int type, const char *str) |
23077 | 835 { |
836 if (type & GTK_MB_FATAL) | |
837 MessageBox(NULL, str, "MPlayer GUI for Windows Error", MB_OK | MB_ICONERROR); | |
838 | |
839 fprintf(stderr, "[GUI] MessageBox: %s\n", str); | |
840 fflush(stderr); | |
841 } | |
842 | |
843 static int update_subwindow(void) | |
844 { | |
845 int x,y; | |
846 RECT rd; | |
847 WINDOWPOS wp; | |
848 | |
849 if(!sub_window) | |
850 { | |
33567 | 851 WinID = -1; |
23077 | 852 |
33555 | 853 if(IsWindowVisible(mygui->subwindow) && guiInfo.sh_video && guiInfo.Playing) |
23077 | 854 { |
855 ShowWindow(mygui->subwindow, SW_HIDE); | |
856 return 0; | |
857 } | |
33555 | 858 else if(guiInfo.AudioOnly) |
23077 | 859 return 0; |
860 else ShowWindow(mygui->subwindow, SW_SHOW); | |
861 } | |
862 | |
863 /* we've come out of fullscreen at the end of file */ | |
33555 | 864 if((!IsWindowVisible(mygui->subwindow) || IsIconic(mygui->subwindow)) && !guiInfo.AudioOnly) |
23077 | 865 ShowWindow(mygui->subwindow, SW_SHOWNORMAL); |
866 | |
867 /* get our current window coordinates */ | |
868 GetWindowRect(mygui->subwindow, &rd); | |
869 | |
870 x = rd.left; | |
871 y = rd.top; | |
872 | |
873 /* restore sub window position when coming out of fullscreen */ | |
874 if(x <= 0) x = old_rect.left; | |
875 if(y <= 0) y = old_rect.top; | |
876 | |
33555 | 877 if(!guiInfo.Playing) |
23077 | 878 { |
879 window *desc = NULL; | |
880 int i; | |
881 | |
882 for (i=0; i<mygui->skin->windowcount; i++) | |
883 if(mygui->skin->windows[i]->type == wiSub) | |
884 desc = mygui->skin->windows[i]; | |
885 | |
886 rd.right = rd.left+desc->base->bitmap[0]->width; | |
887 rd.bottom = rd.top+desc->base->bitmap[0]->height; | |
888 sub_aspect = (float)(rd.right-rd.left)/(rd.bottom-rd.top); | |
889 } | |
890 else | |
891 { | |
33555 | 892 rd.right = rd.left+guiInfo.MovieWidth; |
893 rd.bottom = rd.top+guiInfo.MovieHeight; | |
23077 | 894 |
895 if (movie_aspect > 0.0) // forced aspect from the cmdline | |
896 sub_aspect = movie_aspect; | |
897 } | |
898 | |
899 | |
900 AdjustWindowRect(&rd, WS_OVERLAPPEDWINDOW | WS_SIZEBOX, 0); | |
901 SetWindowPos(mygui->subwindow, 0, x, y, rd.right-rd.left, rd.bottom-rd.top, SWP_NOOWNERZORDER); | |
902 | |
903 wp.hwnd = mygui->subwindow; | |
904 wp.x = rd.left; | |
905 wp.y = rd.top; | |
906 wp.cx = rd.right-rd.left; | |
907 wp.cy = rd.bottom-rd.top; | |
908 wp.flags = SWP_NOOWNERZORDER | SWP_SHOWWINDOW; | |
909 | |
910 /* erase the bitmap image if there's video */ | |
33615
1f9a31d4f114
Replace all playback integer constants by their symbolic constants.
ib
parents:
33614
diff
changeset
|
911 if(guiInfo.Playing != GUI_STOP && guiInfo.sh_video) |
23077 | 912 SendMessage(mygui->subwindow, WM_ERASEBKGND, (WPARAM)GetDC(mygui->subwindow), 0); |
913 | |
914 /* reset the window aspect */ | |
915 SendMessage(mygui->subwindow, WM_WINDOWPOSCHANGED, 0, (LPARAM)&wp); | |
916 return 0; | |
917 } | |
918 | |
919 void guiEventHandling(void) {} |