1693
|
1
|
|
2 // main window
|
|
3
|
|
4 #include "mixer.h"
|
|
5
|
|
6 unsigned char * mplDrawBuffer = NULL;
|
|
7 int mplMainRender = 1;
|
|
8 int mplMainAutoPlay = 0;
|
|
9
|
|
10 int mainVisible = 1;
|
|
11
|
|
12 int boxMoved = 0;
|
|
13 int msButton = 0;
|
|
14 int sx = 0,sy = 0;
|
|
15 int i,pot = 0;
|
|
16
|
|
17 char * Translate( char * str )
|
|
18 {
|
|
19 static char trbuf[512];
|
|
20 char tmp[128];
|
|
21 int i,c;
|
|
22 int t,h,m,s;
|
|
23 memset( trbuf,0,512 );
|
|
24 memset( tmp,0,128 );
|
|
25 for ( c=0,i=0;i < strlen( str );i++ )
|
|
26 {
|
|
27 if ( str[i] != '$' ) { trbuf[c++]=str[i]; trbuf[c]=0; }
|
|
28 else
|
|
29 {
|
|
30 switch ( str[++i] )
|
|
31 {
|
|
32 case 't':
|
1707
|
33 sprintf( tmp,"%02d",mplShMem->Track ); strcat( trbuf,tmp );
|
1693
|
34 break;
|
|
35 case 'f':
|
|
36 if ( strlen( gtkShMem->fs.filename ) )
|
|
37 {
|
|
38 int i;
|
|
39 strcpy( tmp,gtkShMem->fs.filename );
|
|
40 for ( i=0;i < strlen( tmp );i++ )
|
|
41 {
|
|
42 t=0;
|
|
43 if ( ( tmp[i] >= 'A' )&&( tmp[i] <= 'Z' ) ) t=32;
|
|
44 tmp[i]=(char)( tmp[i] + t );
|
|
45 }
|
|
46 if ( tmp[strlen( tmp ) - 4] == '.' ) tmp[strlen( tmp ) - 4]=0;
|
|
47 if ( tmp[strlen( tmp ) - 5] == '.' ) tmp[strlen( tmp ) - 5]=0;
|
|
48 } else strcpy( tmp,"no file loaded" );
|
|
49 strcat( trbuf,tmp );
|
|
50 break;
|
|
51 case 'F':
|
|
52 if ( strlen( gtkShMem->fs.filename ) )
|
|
53 {
|
|
54 int i;
|
|
55 strcpy( tmp,gtkShMem->fs.filename );
|
|
56 for ( i=0;i < strlen( tmp );i++ )
|
|
57 {
|
|
58 char t = 0;
|
|
59 if ( ( tmp[i] >= 'a' )&&( tmp[i] <= 'z' ) ) t=32;
|
|
60 tmp[i]=tmp[i] - t;
|
|
61 }
|
|
62 if ( tmp[strlen( tmp ) - 4] == '.' ) tmp[strlen( tmp ) - 4]=0;
|
|
63 if ( tmp[strlen( tmp ) - 5] == '.' ) tmp[strlen( tmp ) - 5]=0;
|
|
64 } else strcpy( tmp,"NO FILE LOADED" );
|
|
65 strcat( trbuf,tmp );
|
|
66 break;
|
|
67 case 'o':
|
|
68 if ( strlen( gtkShMem->fs.filename ) )
|
|
69 {
|
|
70 strcat( trbuf,gtkShMem->fs.filename );
|
|
71 if ( trbuf[strlen( trbuf ) - 4] == '.' ) trbuf[strlen( trbuf ) - 4]=0;
|
|
72 if ( trbuf[strlen( trbuf ) - 5] == '.' ) trbuf[strlen( trbuf ) - 5]=0;
|
|
73 } else strcat( trbuf,"no file loaded" );
|
|
74 break;
|
|
75 case '6': t=mplShMem->LengthInSec; goto calclengthhhmmss;
|
|
76 case '1': t=mplShMem->TimeSec;
|
|
77 calclengthhhmmss:
|
|
78 s=t%60; t=( t - s ) / 60; m=t%60; h=t/60;
|
|
79 sprintf( tmp,"%02d:%02d:%02d",h,m,s ); strcat( trbuf,tmp );
|
|
80 break;
|
|
81 case '7': t=mplShMem->LengthInSec; goto calclengthmmmmss;
|
|
82 case '2': t=mplShMem->TimeSec;
|
|
83 calclengthmmmmss:
|
|
84 s=t%60; m=( ( t - s ) / 60 ) % 60;
|
|
85 sprintf( tmp,"%04d:%02d",m,s ); strcat( trbuf,tmp );
|
|
86 break;
|
1707
|
87 case '3': sprintf( tmp,"%02d",( mplShMem->TimeSec - ( mplShMem->TimeSec % 60 ) ) / 3600 ); strcat( trbuf,tmp ); break;
|
|
88 case '4': sprintf( tmp,"%02d",( ( mplShMem->TimeSec - ( mplShMem->TimeSec % 60 ) ) / 60 ) % 60 ); strcat( trbuf,tmp ); break;
|
|
89 case '5': sprintf( tmp,"%02d",mplShMem->TimeSec % 60 ); strcat( trbuf,tmp ); break;
|
|
90 case 'v': sprintf( tmp,"%3.2f%%",mplShMem->Volume ); strcat( trbuf,tmp ); break;
|
|
91 case 'V': sprintf( tmp,"%3.1f",mplShMem->Volume ); strcat( trbuf,tmp ); break;
|
|
92 case 'b': sprintf( tmp,"%3.2f%%",mplShMem->Balance ); strcat( trbuf,tmp ); break;
|
|
93 case 'B': sprintf( tmp,"%3.1f",mplShMem->Balance ); strcat( trbuf,tmp ); break;
|
|
94 case 's': if ( mplShMem->Playing == 0 ) strcat( trbuf,"s" ); break;
|
|
95 case 'l': if ( mplShMem->Playing == 1 ) strcat( trbuf,"p" ); break;
|
|
96 case 'e': if ( mplShMem->Playing == 2 ) strcat( trbuf,"e" ); break;
|
|
97 case '$': strcat( trbuf,"$" ); break;
|
1693
|
98 default: continue;
|
|
99 }
|
|
100 c=strlen( trbuf );
|
|
101 }
|
|
102 }
|
|
103 return trbuf;
|
|
104 }
|
|
105
|
|
106 void PutImage( txSample * bf,int x,int y,int max,int ofs )
|
|
107 {
|
|
108 int i=0,ix,iy;
|
|
109 unsigned long * buf = NULL;
|
|
110 unsigned long * drw = NULL;
|
|
111 unsigned long tmp;
|
|
112
|
|
113 if ( ( !bf )||( bf->Image == NULL ) ) return;
|
|
114
|
|
115 i=( bf->Width * ( bf->Height / max ) ) * ofs;
|
|
116 buf=(unsigned long *)mplDrawBuffer;
|
|
117 drw=(unsigned long *)bf->Image;
|
|
118
|
|
119 for ( iy=y;iy < y+bf->Height / max;iy++ )
|
|
120 for ( ix=x;ix < x+bf->Width;ix++ )
|
|
121 {
|
|
122 tmp=drw[i++];
|
|
123 if ( tmp != 0x00ff00ff )
|
|
124 buf[ iy*appMPlayer.main.Bitmap.Width+ix ]=tmp;
|
|
125 }
|
|
126 }
|
|
127
|
|
128 void mplMainDraw( wsParamDisplay )
|
|
129 {
|
|
130 wItem * item;
|
|
131 txSample * image = NULL;
|
|
132 int i;
|
|
133 char * tmp;
|
|
134
|
|
135 if ( appMPlayer.mainWindow.Visible == wsWindowNotVisible ||
|
|
136 !mainVisible ||
|
|
137 !appMPlayer.mainWindow.Mapped ) return;
|
|
138
|
|
139 if ( mplMainRender )
|
|
140 {
|
|
141 memcpy( mplDrawBuffer,appMPlayer.main.Bitmap.Image,appMPlayer.main.Bitmap.ImageSize );
|
|
142 for( i=0;i < appMPlayer.NumberOfItems + 1;i++ )
|
|
143 {
|
|
144 item=&appMPlayer.Items[i];
|
|
145 switch( item->type )
|
|
146 {
|
|
147 case itButton:
|
|
148 PutImage( &item->Bitmap,item->x,item->y,3,item->pressed );
|
|
149 break;
|
|
150 case itHPotmeter:
|
|
151 PutImage( &item->Bitmap,item->x,item->y,item->phases,item->phases * ( item->value / 100.0f ) );
|
|
152 PutImage( &item->Mask,item->x + (int)( ( item->width - item->psx ) * item->value / 100.0f ),item->y,3,item->pressed );
|
|
153 break;
|
|
154 case itPotmeter:
|
|
155 PutImage( &item->Bitmap,item->x,item->y,item->phases,
|
|
156 item->phases * ( item->value / 100.0f ) );
|
|
157 break;
|
|
158 case itSLabel:
|
|
159 image=fntRender( item->fontid,0,item->width,"%s",item->label );
|
|
160 goto drawrenderedtext;
|
|
161 case itDLabel:
|
1707
|
162 // image=fntRender( item->fontid,( mplTimer / 10 )%item->width,item->width,"%s",Translate( item->label ) );
|
|
163 image=fntRender( item->fontid,( mplRedrawTimer / 10 )%item->width,item->width,"%s",Translate( item->label ) );
|
1693
|
164 drawrenderedtext:
|
|
165 PutImage( image,item->x,item->y,1,0 );
|
|
166 if ( image )
|
|
167 {
|
|
168 if ( image->Image ) free( image->Image );
|
|
169 free( image );
|
|
170 }
|
|
171 break;
|
|
172 }
|
|
173 }
|
|
174 wsConvert( &appMPlayer.mainWindow,mplDrawBuffer,appMPlayer.main.Bitmap.ImageSize );
|
|
175 mplMainRender=0;
|
|
176 }
|
|
177 wsPutImage( &appMPlayer.mainWindow );
|
1707
|
178 XFlush( wsDisplay );
|
1693
|
179 }
|
|
180
|
|
181 void mplMsgHandle( int msg,float param )
|
|
182 {
|
|
183 int j;
|
|
184
|
|
185 switch( msg )
|
|
186 {
|
|
187 // --- user events
|
|
188 case evExit:
|
|
189 wsDoExit();
|
|
190 break;
|
|
191 case evIconify:
|
|
192 wsIconify( appMPlayer.mainWindow );
|
|
193 break;
|
|
194 case evFullScreen:
|
|
195 for ( j=0;j<appMPlayer.NumberOfItems + 1;j++ )
|
|
196 {
|
|
197 if ( appMPlayer.Items[j].msg == evFullScreen )
|
|
198 {
|
|
199 appMPlayer.Items[j].tmp=!appMPlayer.Items[j].tmp;
|
|
200 appMPlayer.Items[j].pressed=appMPlayer.Items[j].tmp;
|
|
201 }
|
|
202 }
|
|
203 mplMainRender=1;
|
|
204 mplFullScreen();
|
|
205 break;
|
|
206
|
|
207 case evPlaySwitchToPause:
|
|
208 if ( Filename )
|
|
209 {
|
|
210 btnModify( evPlaySwitchToPause,btnDisabled );
|
|
211 btnModify( evPauseSwitchToPlay,btnReleased );
|
|
212 }
|
|
213 if ( mplShMem->Playing == 1 ) goto NoPause;
|
|
214 case evPlay:
|
|
215 mplMainRender=1;
|
|
216 mplPlay();
|
|
217 break;
|
|
218
|
|
219 case evPauseSwitchToPlay:
|
|
220 btnModify( evPlaySwitchToPause,btnReleased );
|
|
221 btnModify( evPauseSwitchToPlay,btnDisabled );
|
|
222 case evPause:
|
|
223 NoPause:
|
|
224 mplMainRender=1;
|
|
225 mplPause();
|
|
226 break;
|
|
227
|
|
228 case evStop:
|
|
229 btnModify( evPlaySwitchToPause,btnReleased );
|
|
230 btnModify( evPauseSwitchToPlay,btnDisabled );
|
|
231 mplMainRender=1;
|
|
232 mplStop();
|
|
233 break;
|
|
234
|
|
235 case evLoadPlay:
|
|
236 mplMainAutoPlay=1;
|
|
237 case evLoad:
|
|
238 mplMainRender=1;
|
|
239 gtkSendMessage( evLoad );
|
|
240 break;
|
|
241 case evPrev:
|
|
242 mplMainRender=1;
|
|
243 #ifdef DEBUG
|
|
244 dbprintf( 1,"[mw.h] previous stream ...\n" );
|
|
245 #endif
|
|
246 break;
|
|
247 case evNext:
|
|
248 mplMainRender=1;
|
|
249 #ifdef DEBUG
|
|
250 dbprintf( 1,"[mw.h] next stream ...\n" );
|
|
251 #endif
|
|
252 break;
|
|
253
|
|
254 case evPlayList:
|
|
255 mplMainRender=1;
|
|
256 if ( gtkVisiblePlayList )
|
|
257 {
|
|
258 btnModify( evPlayList,btnReleased );
|
|
259 gtkShMem->vs.window=evPlayList;
|
|
260 gtkSendMessage( evHideWindow );
|
|
261 gtkVisiblePlayList=0;
|
|
262 }
|
|
263 else
|
|
264 {
|
|
265 gtkSendMessage( evPlayList );
|
|
266 btnModify( evPlayList,btnPressed );
|
|
267 gtkVisiblePlayList=1;
|
|
268 }
|
|
269 break;
|
|
270
|
|
271 case evSkinBrowser: gtkSendMessage( evSkinBrowser ); break;
|
|
272 case evAbout: gtkSendMessage( evAbout ); break;
|
|
273 case evPreferences: gtkSendMessage( evPreferences ); break;
|
|
274
|
|
275 case evForward1min: mplRelSeek( 60 ); break;
|
|
276 case evBackward1min: mplRelSeek( -60 ); break;
|
|
277 case evForward10sec: mplRelSeek( 10 ); break;
|
|
278 case evBackward10sec: mplRelSeek( -10 ); break;
|
|
279 case evSetMoviePosition: mplAbsSeek( param ); break;
|
|
280
|
|
281 case evIncVolume: mixerIncVolume(); break;
|
|
282 case evDecVolume: mixerDecVolume(); break;
|
|
283 case evSetVolume: mixerSetVolume( param ); break;
|
|
284 case evSetBalance: mixerSetBalance( param ); break;
|
|
285 case evMute: mixerMute(); break;
|
|
286
|
|
287 case evIncAudioBufDelay: mplIncAudioBufDelay(); break;
|
|
288 case evDecAudioBufDelay: mplDecAudioBufDelay(); break;
|
|
289
|
|
290 case evNormalSize: if ( mplShMem->Playing ) wsResizeWindow( &appMPlayer.subWindow,mplwidth,mplheight ); break;
|
|
291 case evDoubleSize: if ( mplShMem->Playing ) wsResizeWindow( &appMPlayer.subWindow,mplwidth * 2,mplheight * 2 ); break;
|
|
292
|
|
293 // --- timer events
|
|
294 case evHideMouseCursor:
|
|
295 wsVisibleMouse( &appMPlayer.subWindow,wsHideMouseCursor );
|
|
296 break;
|
|
297 case evRedraw:
|
|
298 mplMainRender=1;
|
|
299 wsPostRedisplay( &appMPlayer.mainWindow );
|
|
300 if ( !mplShMem->Playing ) wsPostRedisplay( &appMPlayer.subWindow );
|
|
301 XFlush( wsDisplay );
|
|
302 mplRedrawTimer=mplRedrawTimerConst;
|
|
303 break;
|
|
304 case evGeneralTimer:
|
|
305 if ( mplMainAutoPlay )
|
|
306 {
|
|
307 mplMainRender=1;
|
|
308 mplMainAutoPlay=0;
|
|
309 mplPlay();
|
|
310 }
|
|
311 break;
|
|
312 // --- system events
|
|
313 case evNone:
|
|
314 dbprintf( 1,"[mw] event none received.\n" );
|
|
315 break;
|
|
316 default:
|
|
317 dbprintf( 1,"[mw] unknown event received ( %d,%.2f ).\n",msg,param );
|
|
318 break;
|
|
319 }
|
|
320 }
|
|
321
|
|
322 void mplMainMouseHandle( int Button,int X,int Y,int RX,int RY )
|
|
323 {
|
|
324 static int itemtype = 0;
|
|
325 static int SelectedButton = -1;
|
|
326 wItem * item = NULL;
|
|
327 float value = 0.0f;
|
|
328 wsVisibleMouse( &appMPlayer.subWindow,wsShowMouseCursor );
|
|
329 switch ( Button )
|
|
330 {
|
|
331 case wsPRMouseButton:
|
|
332 mplShowMenu( RX,RY );
|
|
333 msButton=wsPRMouseButton;
|
|
334 break;
|
|
335 case wsRRMouseButton:
|
|
336 mplHideMenu( RX,RY );
|
|
337 msButton=0;
|
|
338 break;
|
|
339 case wsPLMouseButton:
|
|
340 sx=X; sy=Y;
|
|
341 boxMoved=1;
|
|
342 msButton=wsPLMouseButton;
|
|
343 for ( i=0;i < appMPlayer.NumberOfItems + 1;i++ )
|
|
344 {
|
|
345 item=&appMPlayer.Items[i];
|
|
346 if ( item->pressed != btnDisabled )
|
|
347 {
|
|
348 switch( item->type )
|
|
349 {
|
|
350 case itButton:
|
|
351 if ( wgIsRect( X,Y,
|
|
352 item->x,item->y,
|
|
353 item->x+item->width,item->y+item->height ) )
|
|
354 {
|
|
355 item->pressed=btnPressed;
|
|
356 mplMainRender=1;
|
|
357 SelectedButton=i;
|
|
358 msButton=0;
|
|
359 boxMoved=0;
|
|
360 }
|
|
361 if ( ( SelectedButton > -1 ) &&
|
|
362 ( ( ( appMPlayer.Items[SelectedButton].msg == evPlaySwitchToPause && item->msg == evPauseSwitchToPlay ) ) ||
|
|
363 ( ( appMPlayer.Items[SelectedButton].msg == evPauseSwitchToPlay && item->msg == evPlaySwitchToPause ) ) ) )
|
|
364 {
|
|
365 appMPlayer.Items[SelectedButton].pressed=btnDisabled;
|
|
366 SelectedButton=i;
|
|
367 appMPlayer.Items[SelectedButton].pressed=btnPressed;
|
|
368 }
|
|
369 itemtype=itButton;
|
|
370 break;
|
|
371 case itPotmeter:
|
|
372 if ( wgIsRect( X,Y,
|
|
373 item->x,item->y,
|
|
374 item->x+item->width,item->y+item->height ) )
|
|
375 {
|
|
376 item->pressed=btnPressed;
|
|
377 mplMainRender=1;
|
|
378 SelectedButton=i;
|
|
379 boxMoved=0;
|
|
380 msButton=itPotmeter;
|
|
381 itemtype=itPotmeter;
|
|
382 }
|
|
383 break;
|
|
384 case itHPotmeter:
|
|
385 if ( wgIsRect( X,Y,
|
|
386 item->x,item->y,
|
|
387 item->x+item->width,item->y+item->height ) )
|
|
388 {
|
|
389 item->pressed=btnPressed;
|
|
390 mplMainRender=1;
|
|
391 SelectedButton=i;
|
|
392 boxMoved=0;
|
|
393 msButton=itHPotmeter;
|
|
394 itemtype=itHPotmeter;
|
|
395 }
|
|
396 break;
|
|
397 }
|
|
398 }
|
|
399 }
|
|
400 break;
|
|
401 case wsMoveMouse:
|
|
402 item=&appMPlayer.Items[SelectedButton];
|
|
403 switch ( msButton )
|
|
404 {
|
|
405 case wsPLMouseButton:
|
|
406 wsMoveWindow( &appMPlayer.mainWindow,RX - abs( sx ),RY - abs( sy ) );
|
|
407 mplMainRender=0;
|
|
408 break;
|
|
409 case wsPRMouseButton:
|
|
410 mplMenuMouseHandle( X,Y,RX,RY );
|
|
411 break;
|
|
412 case itPotmeter:
|
|
413 value=(float)( X - item->x ) / item->width * 100.0f;
|
|
414 goto potihandled;
|
|
415 case itHPotmeter:
|
|
416 value=(float)( X - item->x ) / item->width * 100.0f;
|
|
417 potihandled:
|
|
418 btnModify( item->msg,value );
|
|
419 if ( ( item->msg == evSetVolume )||( item->msg == evSetBalance ) ) mplMsgHandle( item->msg,item->value );
|
|
420 mplMainRender=1; wsPostRedisplay( &appMPlayer.mainWindow );
|
|
421 break;
|
|
422 }
|
|
423 break;
|
|
424 case wsRLMouseButton:
|
|
425 msButton=0;
|
|
426 boxMoved=0;
|
|
427 item=&appMPlayer.Items[SelectedButton];
|
|
428 item->pressed=btnReleased;
|
|
429 switch( itemtype )
|
|
430 {
|
|
431 case itButton:
|
|
432 if ( wgIsRect( X,Y,
|
|
433 item->x,item->y,
|
|
434 item->x+item->width,item->y+item->height ) ) value=0;
|
|
435 break;
|
|
436 case itPotmeter:
|
|
437 case itHPotmeter:
|
|
438 btnModify( item->msg,(float)( X - item->x ) / item->width * 100.0f );
|
|
439 value=item->value;
|
|
440 break;
|
|
441 }
|
|
442 if ( SelectedButton != -1 ) mplMsgHandle( item->msg,value );
|
|
443 SelectedButton=-1;
|
|
444 mplMainRender=1;
|
|
445 itemtype=0;
|
|
446 break;
|
|
447 case wsPMMouseButton: break;
|
|
448 case wsRMMouseButton: break;
|
|
449 }
|
|
450 if ( Button != wsMoveMouse ) wsPostRedisplay( &appMPlayer.mainWindow );
|
|
451 }
|
|
452
|
|
453 int keyPressed = 0;
|
|
454
|
|
455 void mplMainKeyHandle( int State,int Type,int Key )
|
|
456 {
|
|
457 int msg = evNone;
|
|
458 switch ( Key )
|
|
459 {
|
|
460 case '.':
|
|
461 case '>': msg=evNext; break;
|
|
462 case ',':
|
|
463 case '<': msg=evPrev; break;
|
|
464
|
|
465 case wsx:
|
|
466 case wsX:
|
|
467 case wsEscape: msg=evExit; break;
|
|
468
|
|
469 case wsUp: msg=evForward1min; break;
|
|
470 case wsDown: msg=evBackward1min; break;
|
|
471 case wsRight: msg=evForward10sec; break;
|
|
472 case wsLeft: msg=evBackward10sec; break;
|
|
473
|
|
474 case wsGrayMul: msg=evIncVolume; break;
|
|
475 case wsGrayDiv: msg=evDecVolume; break;
|
|
476
|
|
477 case wsGrayPlus: msg=evIncAudioBufDelay; break;
|
|
478 case wsGrayMinus: msg=evDecAudioBufDelay; break;
|
|
479
|
|
480 case wsEnter: msg=evPlay; break;
|
|
481 case wsSpace: msg=evPause; break;
|
|
482 case wsa:
|
|
483 case wsA: msg=evAbout; break;
|
|
484 case wsb:
|
|
485 case wsB: msg=evSkinBrowser; break;
|
|
486 case wse:
|
|
487 case wsE: msg=evEqualeaser; break;
|
|
488 case wsf:
|
|
489 case wsF: msg=evFullScreen; break;
|
|
490 case wsl:
|
|
491 case wsL: msg=evLoad; break;
|
|
492 case wsm:
|
|
493 case wsM: msg=evMute; break;
|
|
494 case wss:
|
|
495 case wsS: msg=evStop; break;
|
|
496 case wsp:
|
|
497 case wsP: msg=evPlayList; break;
|
|
498 }
|
|
499 if ( ( msg != evNone )&&( Type == wsKeyPressed ) )
|
|
500 {
|
|
501 mplMsgHandle( msg,0 );
|
|
502 mplMainRender=1;
|
|
503 wsPostRedisplay( &appMPlayer.mainWindow );
|
|
504 }
|
|
505 }
|