2 -----BEGIN PGP SIGNED MESSAGE-----
5 m m mm mmm .----------. .---------------------. mmm mm m m
6 8 8 88 888 | .--------` | .------------------` 888 88 8 8
7 8 8 88 888 | ```````|`V```````| |``||``|`````| 888 88 8 8
8 8 8 88 888 `------ | | [] | |``````|| | [] | 888 88 8 8
9 8 8 88 888 |`````` | | | ````|```` | | 888 88 8 8
10 ` ` `` ``` ``````````````> |````````````| |`` ``` `` ` `
12 L A B O R A T O R I E S
14 This file is part of Hacker Radio Rec.
16 Hacker Radio Rec is free software: you can redistribute it and/or
17 modify it under the terms of the GNU General Public License as
18 published by the Free Software Foundation, either version 3 of
19 the License or (at your option) any later version.
21 Hacker Radio Rec is distributed in the hope that it will be
22 useful, but WITHOUT ANY WARRANTY; without even the implied
23 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
24 See the GNU General Public License for more details.
26 Copyright (C) 2009, Thea DeSilva
27 You can find a copy of GNU General Public License in COPYING
32 struct menu_entry_t menu_wave_text
[] = {
33 {"copy", CALL_BUTTON
, MENU_WAVE_COPY
, menu_bottom
},
34 {"cut", CALL_BUTTON
, MENU_WAVE_CUT
, menu_bottom
},
35 {"paste", CALL_BUTTON
, MENU_WAVE_PASTE
, menu_bottom
},
36 {"zoom to",CALL_BUTTON
, MENU_WAVE_ZOOMTO
, menu_bottom
},
37 {"clear", CALL_BUTTON
, MENU_WAVE_CLEAR
, menu_bottom
},
38 {"delete", CALL_BUTTON
, MENU_WAVE_DELETE
, menu_bottom
},
39 {NULL
, NULL
, NULL
, NULL
}
42 const color_t menu_color
= { 0xaf, 0xaf, 0x54 };
44 struct menu_entry_t menu_button_text
[] = {
45 {"load", CALL_BUTTON
, MENU_LOAD
, menu_bottom
},
46 {"save", CALL_BUTTON
, MENU_SAVE
, menu_bottom
},
47 {"clear selection", CALL_BUTTON
, MENU_CLEAR
, menu_bottom
},
48 {"clear track", CALL_BUTTON
, MENU_CLEAR_TRACK
, menu_bottom
},
49 {NULL
, NULL
, NULL
, NULL
}
52 struct select_file_t
*cue_file
;
54 stk_t stk
[STACK_SIZE
];
55 Sint32 stk_pointer
= 0;
57 char tmp_path
[MAX_CHARS
] = { 0 };
59 group_t
*main_grp
, *sub_grp
, *splash_grp
, *time_bar_grp
, *menu_grp
, *menu_wave_grp
;
61 struct object_t
*vert
, *time_bar
, *main_obj
;
63 struct object_t
*start_obj
, *stop_obj
, *pause_obj
, *play_obj
, *end_obj
, *rec_obj
;
64 struct object_t
*progress_bar
, *message_bar
, *memory_bar
;
68 Sint32 clear_dir_depth
;
70 Sint32
clear_dir(char *path
) {
76 unsigned char *buf
, *ebuf
, *cp
;
78 if((fp
=open(path
, O_RDONLY
,0)) == -1)
81 buf
= (unsigned char *)malloc(sb
.st_size
);
84 while((nbytes
= getdirentries(fp
,buf
,sb
.st_size
,&base
)) > 0 ){
88 dp
= (struct dirent
*)cp
;
90 if(dp
->d_type
== DT_REG
) {
91 snprintf(buf2
, MAX_CHARS
, "%s/%s", path
, dp
->d_name
);
92 if(unlink(buf2
)<0) return 0;
94 if(dp
->d_type
== DT_DIR
&&
95 strcmp(".", dp
->d_name
)!=0 &&
96 strcmp("..",dp
->d_name
)!=0) {
97 snprintf(buf2
,MAX_CHARS
-1,"%s/%s", path
,dp
->d_name
);
98 if(clear_dir(buf2
)==0) return 0;
110 if(clear_dir_depth
== 0)
115 /* setup_windows {{{ */
116 void setup_windows(Sint32 w
, Sint32 h
) {
117 obj_param_t tmp_parm
;
118 struct object_t
*tmp_obj
;
120 main_grp
= new_group(0,0, gui_screen
->w
, gui_screen
->h
, 0,0);
122 // PARM(0,0, w, h, &globl_fg, &globl_bg, 0, proc_back);
124 tmp_parm
.x
= 0; tmp_parm
.y
= 0;
125 tmp_parm
.w
= w
; tmp_parm
.h
= h
;
126 tmp_parm
.fg
= &globl_fg
;
127 tmp_parm
.bg
= &globl_bg
;
129 tmp_parm
.proc
= proc_back
;
131 new_obj(main_grp
, &tmp_parm
);
133 if(config_file
.do_splash
==1) {
134 tmp_parm
.proc
= proc_start_splash
;
135 new_obj(main_grp
, &tmp_parm
);
139 PARM( VX(311)+1, VY(8)+1, 22, 20, &globl_fg
, &globl_bg
, LOAD_XPM_FROM_ARRAY
|SHOW_FOCUS
|CALL_BUTTON
, proc_icon_button
);
140 tmp_parm
.dp1
= (void *)move_xpm
;
143 tmp_parm
.callback
= bottom
;
144 tmp_parm
.user_flags
= CMD_MOVE
;
145 new_obj(main_grp
, &tmp_parm
);
148 PARM( VX(311), VY(8), 24, 22, &globl_fg
, &globl_bg
, DROP_SHADOW
, proc_shadow_box
);
149 new_obj(main_grp
, &tmp_parm
);
151 PARM( VX(275)+1, VY(8)+1, 22, 20, &globl_fg
, &globl_bg
, LOAD_XPM_FROM_ARRAY
|SHOW_FOCUS
|CALL_BUTTON
, proc_icon_button
);
152 tmp_parm
.dp1
= (void *)envelope_xpm
;
155 tmp_parm
.callback
= bottom
;
156 tmp_parm
.user_flags
= CMD_ENVELOPE
;
157 new_obj(main_grp
, &tmp_parm
);
160 PARM( VX(275), VY(8), 24, 22, &globl_fg
, &globl_bg
, DROP_SHADOW
, proc_shadow_box
);
161 new_obj(main_grp
, &tmp_parm
);
163 PARM( VX(237)+1, VY(8)+1, 22, 20, &globl_fg
, &globl_bg
, LOAD_XPM_FROM_ARRAY
|SHOW_FOCUS
|CALL_BUTTON
, proc_icon_button
);
164 tmp_parm
.dp1
= (void *)select_xpm
;
167 tmp_parm
.callback
= bottom
;
168 tmp_parm
.user_flags
= CMD_SELECT
;
169 new_obj(main_grp
, &tmp_parm
);
170 current_tool
= TOOL_SELECT
;
171 PARM( VX(237), VY(8), 24, 22, &globl_fg
, &globl_bg
, DROP_SHADOW
, proc_shadow_box
);
172 new_obj(main_grp
, &tmp_parm
);
177 PARM( VX(94), VY(8), VX(85), VY(22), &globl_fg
, &globl_bg
, DROP_SHADOW
|SHOW_FOCUS
|CALL_BUTTON
, proc_button_box
);
178 tmp_parm
.dp1
= (void *)"menu";
179 tmp_parm
.user_flags
= CMD_MENU
;
180 tmp_parm
.callback
= bottom
;
181 tmp_obj
= new_obj(main_grp
, &tmp_parm
);
183 PARM( VX(6), VY(8), VX(85), VY(22), &globl_fg
, &globl_bg
, DROP_SHADOW
|SHOW_FOCUS
|CALL_BUTTON
, proc_button_box
);
184 tmp_parm
.dp1
= (void *)"live";
185 tmp_parm
.callback
= bottom
;
186 tmp_parm
.user_flags
= CMD_LIVE
;
187 new_obj(main_grp
, &tmp_parm
);
189 PARM( VX(707), VY(8), VX(85), VY(22), &globl_fg
, &globl_bg
, DROP_SHADOW
|SHOW_FOCUS
|CALL_BUTTON
, proc_button_box
);
190 tmp_parm
.dp1
= (void *)"quit";
191 tmp_parm
.callback
= nah_really
;
192 new_obj(main_grp
, &tmp_parm
);
194 PARM( VX(619), VY(8), VX(85), VY(22), &globl_fg
, &globl_bg
, DROP_SHADOW
|SHOW_FOCUS
|CALL_BUTTON
, proc_button_box
);
195 tmp_parm
.dp1
= (void *)"manual";
196 tmp_parm
.callback
= bottom
;
197 tmp_parm
.user_flags
= CMD_MANUAL
;
198 new_obj(main_grp
, &tmp_parm
);
202 PARM( VX(575)+1, VY(8)+1, 22, 20, &globl_fg
, &globl_bg
,
203 LOAD_XPM_FROM_ARRAY
|SHOW_FOCUS
|SINGLE_RADIO
|CALL_BUTTON
, proc_icon_button
);
204 tmp_parm
.dp1
= (void *)end_xpm
;
207 tmp_parm
.user_flags
= CMD_END
;
208 tmp_parm
.callback
= bottom
;
209 end_obj
= new_obj(main_grp
, &tmp_parm
);
210 PARM( VX(575), VY(8), 24, 22, &globl_fg
, &globl_bg
, DROP_SHADOW
, proc_shadow_box
);
211 new_obj(main_grp
, &tmp_parm
);
213 PARM( VX(539)+1, VY(8)+1, 22, 20, &globl_fg
, &globl_bg
,
214 LOAD_XPM_FROM_ARRAY
|SHOW_FOCUS
|SINGLE_RADIO
|CALL_BUTTON
, proc_icon_button
);
215 tmp_parm
.dp1
= (void *)rec_xpm
;
218 tmp_parm
.user_flags
= CMD_REC
;
219 tmp_parm
.callback
= bottom
;
220 rec_obj
= new_obj(main_grp
, &tmp_parm
);
221 PARM( VX(539), VY(8), 24, 22, &globl_fg
, &globl_bg
, DROP_SHADOW
, proc_shadow_box
);
222 new_obj(main_grp
, &tmp_parm
);
224 PARM( VX(503)+1, VY(8)+1, 22, 20, &globl_fg
, &globl_bg
,
225 LOAD_XPM_FROM_ARRAY
|SHOW_FOCUS
|SINGLE_RADIO
|CALL_BUTTON
, proc_icon_button
);
226 tmp_parm
.dp1
= (void *)play_xpm
;
229 tmp_parm
.user_flags
= CMD_PLAY
;
230 tmp_parm
.callback
= bottom
;
232 play_obj
= new_obj(main_grp
, &tmp_parm
);
233 PARM( VX(503), VY(8), 24, 22, &globl_fg
, &globl_bg
, DROP_SHADOW
, proc_shadow_box
);
234 new_obj(main_grp
, &tmp_parm
);
236 PARM( VX(467)+1, VY(8)+1, 22, 20, &globl_fg
, &globl_bg
,
237 LOAD_XPM_FROM_ARRAY
|SHOW_FOCUS
|SINGLE_RADIO
|CALL_BUTTON
, proc_icon_button
);
238 tmp_parm
.dp1
= (void *)pause_xpm
;
241 tmp_parm
.user_flags
= CMD_PAUSE
;
242 tmp_parm
.callback
= bottom
;
243 pause_obj
= new_obj(main_grp
, &tmp_parm
);
244 PARM( VX(467), VY(8), 24, 22, &globl_fg
, &globl_bg
, DROP_SHADOW
, proc_shadow_box
);
245 new_obj(main_grp
, &tmp_parm
);
247 PARM( VX(431)+1, VY(8)+1, 22, 20, &globl_fg
, &globl_bg
,
248 LOAD_XPM_FROM_ARRAY
|SHOW_FOCUS
|SINGLE_RADIO
|CALL_BUTTON
, proc_icon_button
);
249 tmp_parm
.dp1
= (void *)stop_xpm
;
252 tmp_parm
.user_flags
= CMD_STOP
;
253 tmp_parm
.callback
= bottom
;
254 stop_obj
= new_obj(main_grp
, &tmp_parm
);
255 PARM( VX(431), VY(8), 24, 22, &globl_fg
, &globl_bg
, DROP_SHADOW
, proc_shadow_box
);
256 new_obj(main_grp
, &tmp_parm
);
258 PARM( VX(395)+1, VY(8)+1, 22, 20, &globl_fg
, &globl_bg
,
259 LOAD_XPM_FROM_ARRAY
|SHOW_FOCUS
|SINGLE_RADIO
|CALL_BUTTON
, proc_icon_button
);
260 tmp_parm
.dp1
= (void *)start_xpm
;
263 tmp_parm
.user_flags
= CMD_START
;
264 tmp_parm
.callback
= bottom
;
265 start_obj
= new_obj(main_grp
, &tmp_parm
);
266 PARM( VX(395), VY(8), 24, 22, &globl_fg
, &globl_bg
, DROP_SHADOW
, proc_shadow_box
);
267 new_obj(main_grp
, &tmp_parm
);
269 PARM( VX(778), VY(41), VX(11), VY(554)-35, &globl_fg
, &globl_bg
, SHOW_FOCUS
|CALL_BUTTON
, proc_scroll_bar
);
272 tmp_parm
.user_flags
= CMD_VSCROLL
;
273 tmp_parm
.callback
= bottom
;
274 vert
= new_obj(main_grp
, &tmp_parm
);
277 PARM( VX(10), VY(41), VX(765), VY(554)-34, &globl_fg
, &globl_bg
, 0, proc_box
);
278 new_obj(main_grp
, &tmp_parm
);
280 PARM( VX(10)+1, VY(41)+1, VX(765)-1, VY(554)-35, &globl_fg
, &globl_bg
, 0, proc_main
);
281 main_obj
= new_obj(main_grp
, &tmp_parm
);
283 PARM(VX(10)+1,VY(554)+11, 127, 22, &globl_fg
, &globl_bg
, 0, proc_progress_bar
);
284 tmp_parm
.dp1
= progress_bar_xpm
;
285 tmp_parm
.dp2
= progress_bar2_xpm
;
286 progress_bar
= new_obj(main_grp
, &tmp_parm
);
288 PARM( VX(10), VY(554)+10, 128, 23, &globl_fg
, &globl_bg
, 0, proc_box
);
289 new_obj(main_grp
, &tmp_parm
);
291 PARM( VX(10)+131, VY(554)+11, VX(786)-141-50, 22, &globl_bg
, &globl_fg
, 0, proc_message_bar
);
292 message_bar
= new_obj(main_grp
, &tmp_parm
);
295 PARM(message_bar
->param
.x
+message_bar
->param
.w
,
296 message_bar
->param
.y
, 50, 22, &globl_fg
, &globl_bg
, 0,
298 memory_bar
= new_obj(main_grp
, &tmp_parm
);
302 PARM( VX(10)+130, VY(554)+10, VX(786)-140, 23, &globl_fg
, &globl_bg
, 0, proc_box
);
303 new_obj(main_grp
, &tmp_parm
);
306 PARM( VX(6), VY(37), VX(786), VY(554), &globl_fg
, &globl_bg
, 0, proc_shadow_box
);
307 new_obj(main_grp
, &tmp_parm
);
312 new_menu(tmp_obj
->param
.x
+2, tmp_obj
->param
.y
+2, menu_button_text
, &globl_fg
, &globl_bg
);
315 new_menu(tmp_obj
->param
.x
+2, tmp_obj
->param
.y
+2, menu_wave_text
, &globl_fg
, &menu_color
);
319 cue_file
= setup_overlay_window(400, 300, LOAD
, "pants", cue_file_bot
);
323 /* setup_main_obj {{{ */
324 Sint32
setup_main_obj(void) {
325 obj_param_t tmp_parm
;
327 sub_grp
= new_group(0,0, main_obj
->param
.w
, main_obj
->param
.h
,0,0);
328 intern_update
= norm_update
;
330 for(y
=0;y
<TRACKS
;y
++) {
331 PARM( 6, 62 +(TRACK_SIZE
* y
) , 0, 8, &globl_fg
, &globl_bg
, SHOW_FOCUS
| SINGLE_RADIO
, proc_radio_button
);
334 tmp_parm
.dp1
= (void *)"auto";
335 new_obj(sub_grp
, &tmp_parm
);
337 PARM( 6, 75 +(TRACK_SIZE
*y
), 0, 8, &globl_fg
, &globl_bg
, SHOW_FOCUS
| SINGLE_RADIO
, proc_radio_button
);
340 tmp_parm
.dp1
= (void *)"mute";
341 new_obj(sub_grp
, &tmp_parm
);
343 PARM( 15, 90 +(TRACK_SIZE
*y
), 0, 0, &globl_fg
, &globl_bg
,
344 SHOW_FOCUS
| SINGLE_RADIO
|LOAD_XPM_FROM_ARRAY
|CALL_BUTTON
|FADE
, proc_icon_button
);
347 tmp_parm
.dp1
= (void *)cue_xpm
;
348 tmp_parm
.dp2
= (void *)cue_inactive_xpm
;
349 tmp_parm
.callback
= bottom
;
350 tmp_parm
.user_flags
= CMD_CUE
;
351 tracks
[y
].cue
= new_obj(sub_grp
, &tmp_parm
);
354 PARM( 11, 8 +TRACK_SIZE
* y
, 0,0, &globl_fg
, &globl_bg
, ((y
&1)==0 ? BLUE
: 0), proc_knob
);
357 new_obj(sub_grp
, &tmp_parm
);
359 PARM( 4, 2 + (TRACK_SIZE
* y
), 56, 110, &globl_fg
, &globl_bg
, 0, proc_shadow_box
);
360 new_obj(sub_grp
, &tmp_parm
);
362 PARM( 66, 3 + (TRACK_SIZE
* y
), main_obj
->param
.w
- 71, 169, &globl_fg
, &globl_bg
, 0, proc_wave
);
364 tracks
[y
].wave
= new_obj(sub_grp
, &tmp_parm
);
368 PARM( 65, 2 + (TRACK_SIZE
* y
), main_obj
->param
.w
- 70, 170, &globl_fg
, &globl_bg
, 0, proc_shadow_box
);
369 new_obj(sub_grp
, &tmp_parm
);
375 left
= IMG_ReadXPMFromArray(move_left_xpm
);
376 right
= IMG_ReadXPMFromArray(move_right_xpm
);
378 printf("0x%x\n", left
);
381 /* setup_splash {{{ */
382 void setup_splash(void) {
383 obj_param_t tmp_parm
;
384 #define SPLASH_WIDTH 585
385 #define SPLASH_HEIGHT 400
386 splash_grp
= new_group( (gui_screen
->w
/2) - (SPLASH_WIDTH
/2),
387 (gui_screen
->h
/2) - (SPLASH_HEIGHT
/2),
388 SPLASH_WIDTH
+2, SPLASH_HEIGHT
+2, 0,0);
389 simple_window(splash_grp
, SPLASH_WIDTH
, SPLASH_HEIGHT
);
390 PARM(3,15,0,0,&globl_fg
, &globl_bg
, LOAD_XPM_FROM_ARRAY
, proc_bitmap
);
391 tmp_parm
.dp1
= (void *)splash_xpm
;
392 new_obj(splash_grp
, &tmp_parm
);
393 PARM(3,15,580,382,&globl_fg
, &globl_bg
, 0, proc_end_splash
);
394 new_obj(splash_grp
, &tmp_parm
);
400 /* setup_time_bar {{{ */
401 void setup_time_bar(void) {
402 obj_param_t tmp_parm
;
403 time_bar_bmp
= SDL_CreateRGBSurface(SDL_SWSURFACE
, VX(766)-112, 30, 24,
404 gui_screen
->format
->Rmask
, gui_screen
->format
->Gmask
,
405 gui_screen
->format
->Bmask
, gui_screen
->format
->Amask
);
406 if(time_bar_bmp
<= 0) {
410 time_bar_grp
= new_group(0,0, time_bar_bmp
->w
, time_bar_bmp
->h
, 0, 0);
412 PARM( 0, 0, time_bar_bmp
->w
, time_bar_bmp
->h
, &globl_bg
, &globl_fg
, SHOW_FOCUS
|CALL_BUTTON
, proc_time_bar
);
413 time_bar
= new_obj(time_bar_grp
, &tmp_parm
);
415 broadcast_group(time_bar_grp
, MSG_START
,0);
419 void terminate(int sigraised
, siginfo_t
*info
, void *a
) {
420 if(tmp_path
[0] != 0) {
421 printf("\nclearing %s", tmp_path
); fflush(stdout
);
423 if(clear_dir(tmp_path
)==0)
424 printf("Yeah can't do that, you do it\n");
429 SDL_Surface
*ctx_old_gc
, *time_bar_bmp
;
434 struct sigaction action
;
435 pthread_mutexattr_t attr
;
438 sigemptyset(&action
.sa_mask
);
440 action
.sa_handler
= terminate
;
441 sigaction(SIGTERM
, &action
, NULL
);
442 sigaction(SIGINT
, &action
, NULL
);
443 sigaction(SIGQUIT
, &action
, NULL
);
454 globl_move_color
.r
= 90;
455 globl_move_color
.g
= 32;
456 globl_move_color
.b
= 24;
460 snprintf(buf
, MAX_CHARS
, "%s/.hrr/hrr.conf", getenv("HOME"));
461 if(load_config(buf
) == 0)
462 load_config("/etc/hrr.conf");
464 zoom
= 1.0f
/config_file
.start_scale
;
466 init_gui(config_file
.screen_w
, config_file
.screen_h
,config_file
.fullscreen
*FULLSCREEN
);
467 SDL_WM_SetCaption("HRR!!", "HRR!!");
468 SDL_WM_SetIcon(IMG_ReadXPMFromArray(icon_xpm
), NULL
);
470 printf("0x%x\n", gui_screen
);
472 setup_windows(config_file
.screen_w
, config_file
.screen_h
);
474 if(config_file
.do_splash
==1)
478 snprintf(tmp_path
, MAX_CHARS
, "/tmp/hrr_%d", getpid());
480 if(mkdir(tmp_path
, 0644)<0) {
488 pthread_mutexattr_init(&attr
);
489 if(pthread_mutex_init(&mtx
, &attr
)<0) {
494 init_not(HOST
, host_msg_recv
);
497 // coder_thread = new_thread(coder_main);
498 // player_thread = new_thread(player_main);
503 // new_thread(wocka_wocka);
508 // new_thread(update_memory_bar);
509 group_loop(main_grp
);
510 terminate(SIGTERM
, NULL
, NULL
);
514 while(main_grp
->go
==0) SDL_Delay(40);
515 printf("we are a go\n");
516 coder_thread
= new_thread(coder_main
);
517 player_thread
= new_thread(player_main
);
519 new_thread(wocka_wocka
);
520 new_thread(update_memory_bar
);
524 void update_memory_bar(void) {
526 send_host(NOT_MEMORY_BAR
, NULL
, 0, STORE
);
532 Thank you for your attention
533 -----BEGIN PGP SIGNATURE-----
534 Version: GnuPG v1.4.9 (OpenBSD)
536 iEYEARECAAYFAkrsgw4ACgkQMNO4A6bnBrNW2wCgi3Rb9WdU6Y+9Rma4SYALren6
537 L5oAmQH9AF69CyM+S6q5qu1a+z2pkb0A
539 -----END PGP SIGNATURE-----