Revise: add manifest file for SMACK label setting. Log output level correction.(perfo...
[profile/ivi/ico-uxf-homescreen-sample-apps.git] / ico-app-soundsample / src / soundsample.c
1 /*
2  * Copyright (c) 2013, TOYOTA MOTOR CORPORATION.
3  *
4  * This program is licensed under the terms and conditions of the 
5  * Apache License, version 2.0.  The full text of the Apache License is at
6  * http://www.apache.org/licenses/LICENSE-2.0
7  *
8  */
9 /**
10  * @brief   Sound Sample APP
11  *          Test use with which sound is sounded
12  *
13  * @date    Mar-04-2013
14  */
15
16 #include <Ecore.h>
17 #include <Ecore_Evas.h>
18 #include <Elementary.h>
19 //#include <Ecore_X.h>
20 #include <app.h>
21 #include <unistd.h>
22 #include <glib.h>
23 #include <bundle.h>
24 //#include "ico_apf.h"
25 //#include "ico_apf_ecore.h"
26 //#include "ico_apf_log.h"
27 #include "soundsample.h"
28 #include <aul.h>
29 #include "ico_log.h"
30
31 /*============================================================================*/
32 /* Define fixed parameters                                                    */
33 /*============================================================================*/
34 #define STATUS_BAR_HEIGHT (64)
35 #define CTRL_BAR_HEIGHT   (128)
36 #define WIDTH  (1080) /* Base Background width  */
37 #define HEIGHT (1920 - STATUS_BAR_HEIGHT - CTRL_BAR_HEIGHT) /* Base Background height */
38
39 /* Module name */
40 #define MODULE_NAME       "org.tizen.ico.app-soundsample"
41
42 #define CONFIG_FILE       "/usr/apps/org.tizen.ico.app-soundsample/res/soundsample_config.txt"
43 #define BG_IMAGE_FILE     "/usr/apps/org.tizen.ico.app-soundsample/res/images/sound_bg.png"
44
45 #define MAX_BUTTON_NUM    (3)
46 #define MAX_DRAW_LEM      (20)
47
48 #define GROUP_DATA        "data"
49 #define KEY_WAVFILE_PATH  "wavfile_path"
50 #define KEY_SERVER_IP     "server_ip"
51 #define KEY_DEVICE_NAME   "device_name"
52 #define KEY_VOLUME1       "volume1"
53 #define KEY_VOLUME2       "volume2"
54 #define KEY_APP_NAME      "app_name"
55 #define KEY_STREAM_NAME   "stream_name"
56 #define KEY_REPEAT_FLG    "repeat_flg"
57 #define KEY_MEDIA_ROLE    "media_role"
58
59 /* font */
60 #define FONT_SIZE       48
61 #define FONT_FAMILY     (char *)"Sans"  // Mono, Sans, Serif
62
63 /* Text class name */
64 #define TEXT_BUTTON     (char *)"button"
65 #define TEXT_LABEL      (char *)"label"
66
67 /*============================================================================*/
68 /* Define data types                                                          */
69 /*============================================================================*/
70 struct color_val_t
71 {
72     int r;                      /* red   */
73     int g;                      /* green */
74     int b;                      /* blue  */
75     int a;                      /* alpha */
76 };
77
78 struct size_val_t
79 {
80     Evas_Coord w;               /* width  */
81     Evas_Coord h;               /* height */
82 };
83
84 struct font_val_t
85 {
86     char name[255];             /* font name */
87     Evas_Font_Size size;        /* font size */
88 };
89
90 struct pos_val_t
91 {
92     Evas_Coord x;               /* X position */
93     Evas_Coord y;               /* Y position */
94 };
95
96 struct object_text_val_t
97 {
98     struct color_val_t color;
99     struct size_val_t size;
100     struct font_val_t font;
101     struct pos_val_t pos;
102     char text[255];
103     void *func;
104 };
105
106 struct object_figure_val_t
107 {
108     struct color_val_t color;
109     struct size_val_t size;
110     struct pos_val_t pos;
111     char icon_name[64];
112     void *func;
113 };
114
115 struct appdata_t
116 {
117     Evas_Object *win;           //main window
118     Evas_Object *bg;
119
120     Evas_Object *snd_type;
121     Evas_Object *btn_name[MAX_BUTTON_NUM];
122     Evas_Object *btn[MAX_BUTTON_NUM];
123     Evas_Object *icon[MAX_BUTTON_NUM];
124     Evas_Object *sts_txt;
125     Evas_Object *app_name;
126     Evas_Object *strm_name;
127     Evas_Object *pid_txt;
128 };
129
130 /*============================================================================*/
131 /* Function prototype for static(internal) functions                          */
132 /*============================================================================*/
133 static void _on_mousedown1(void *data, Evas_Object *obj, void *event_info);
134 static void _on_mousedown2(void *data, Evas_Object *obj, void *event_info);
135 static void _on_mousedown3(void *data, Evas_Object *obj, void *event_info);
136 static int start_audio(void);
137 static Eina_Bool stop_audio(void *data, Ecore_Fd_Handler *fd_handler);
138 static void rcv_event(int event_num);
139 static void send_event_req(int event_num);
140 static void recv_event_res(int ret);
141 static void chg_state(int state_num);
142 static void conf_check_gerror(char *para_num, GError ** error);
143 static int read_config(void);
144 static void draw_text(Evas_Object *obj, struct object_text_val_t *text);
145 static void draw_figr(Evas_Object *obj, struct object_figure_val_t *figr);
146 //static int get_sound(int argc, char **argv);
147 static bool app_create(void *data);
148 static Evas_Object *_create_win(const char *name);
149 static void _win_del(void *data, Evas_Object *obj, void *event_info);
150 static void app_terminate(void *data);
151 static void _winCreate(void);
152 /*============================================================================*/
153 /* Tables and Valiables                                                       */
154 /*============================================================================*/
155 extern int pulse_main(struct audio_config_t *, int);
156
157 /* application data  */
158 static struct appdata_t Ad;
159
160 /* screen size  */
161 static double Width = 0;
162 static double Height = 0;
163 static double W_mag = 0;
164 static double H_mag = 0;
165
166 /* state values */
167 static int StateNum = STATE_STOP;
168
169 /* file descriptor */
170 static int Filedes[2];
171 static int Filedes2[2];
172
173 /* Child process ID */
174 static pid_t ChPid = 0;
175
176 /* Config data */
177 static struct audio_config_t AudioConfig = {
178     NULL, NULL, NULL, -1, -1, NULL, NULL
179 };
180
181 static struct object_text_val_t SndTypeText = {
182     {0, 0, 0, 255}, {500, 50}, {"Sans", 48}, {25, 25}, "", NULL
183 };
184
185 static struct object_text_val_t ButtonText[MAX_BUTTON_NUM] = {
186     {{255, 0, 0, 255}, {220, 50}, {"Sans", 48}, {100 + 65, 90}, "START",
187      NULL},
188     {{0, 255, 0, 255}, {220, 50}, {"Sans", 48}, {370 + 75, 90}, "STOP", NULL},
189     {{0, 0, 255, 255}, {220, 50}, {"Sans", 48}, {640 + 65, 90}, "PAUSE", NULL}
190 };
191
192 static struct object_figure_val_t ButtonFigr[MAX_BUTTON_NUM] = {
193     {{255, 0, 0, 255}, {220, 95}, {130, 140}, "media_player/play",
194      (void *) _on_mousedown1},
195     {{0, 255, 0, 255}, {220, 95}, {400, 140}, "media_player/stop",
196      (void *) _on_mousedown2},
197     {{0, 0, 255, 255}, {220, 95}, {670, 140}, "media_player/pause",
198      (void *) _on_mousedown3}
199 };
200
201 static struct object_text_val_t StateInfoText = {
202     {0, 0, 0, 255}, {500, 50}, {"Sans", 48}, {330, 300}, "STATE : STOP", NULL
203 };
204
205 static struct object_text_val_t AppNameText = {
206     {0, 0, 0, 255}, {900, 50}, {"Sans", 32}, {150, 410}, "App Name :  ", NULL
207 };
208
209 static struct object_text_val_t StreamNameText = {
210     {0, 0, 0, 255}, {900, 50}, {"Sans", 32}, {150, 490}, "Stream Name :  ",
211     NULL
212 };
213
214 static struct object_text_val_t PidText = {
215     {0, 0, 0, 255}, {900, 50}, {"Sans", 36}, {150, 570}, "PID :  ", NULL
216 };
217
218 static char SsndType[32];
219
220 /*============================================================================*/
221 /* Function                                                                   */
222 /*============================================================================*/
223 static void _on_mousedown1(void *data, Evas_Object *obj, void *event_info)
224 {
225     ICO_PRF("TOUCH_EVENT _on_mousedown1: Enter");
226     ICO_PRF("TOUCH_EVENT Input event   : START");
227
228     rcv_event(START_REQ);
229
230     ICO_PRF("TOUCH_EVENT _on_mousedown1: Leave");
231 }
232
233 static void _on_mousedown2(void *data, Evas_Object *obj, void *event_info)
234 {
235     ICO_PRF("TOUCH_EVENT _on_mousedown2: Enter");
236     ICO_PRF("TOUCH_EVENT Input event  : STOP");
237
238     rcv_event(STOP_REQ);
239
240     ICO_PRF("TOUCH_EVENT _on_mousedown2: Leave");
241 }
242
243 static void _on_mousedown3(void *data, Evas_Object *obj, void *event_info)
244 {
245     ICO_PRF("TOUCH_EVENT _on_mousedown3: Enter");
246     ICO_PRF("TOUCH_EVENT Input event  : PAUSE");
247
248     rcv_event(PAUSE_REQ);
249
250     ICO_PRF("TOUCH_EVENT _on_mousedown3: Leave");
251 }
252
253 static int start_audio(void)
254 {
255     ICO_DBG("start_audio: Enter");
256
257     int ret = 0;
258
259     signal(SIGCLD, SIG_IGN);
260
261     if ((ChPid = fork()) < 0) {
262         ICO_DBG("Err fork");
263         return -1;
264     }
265     else if (ChPid == 0) {
266         /* Processing of child processes to start */
267         close(Filedes[1]);
268         close(Filedes2[0]);
269
270         ICO_DBG("Voice response : START");
271         ret = pulse_main(&AudioConfig, Filedes[0]);
272         ICO_DBG("Voice response : END");
273
274         ICO_DBG("pulse_main: ret = [%d]", ret);
275         recv_event_res(ret);
276
277         close(Filedes[0]);
278         close(Filedes2[1]);
279         /* Termination of child processes */
280         exit(0);
281     }
282
283     /* Processing of parent process */
284     ICO_DBG("Child process: ChPid = [%d]", ChPid);
285
286     ICO_DBG("start_audio: Leave");
287
288     return 0;
289 }
290
291 static Eina_Bool stop_audio(void *data, Ecore_Fd_Handler *fd_handler)
292 {
293     ICO_DBG("stop_audio: Enter");
294
295     char buff[255];
296     memset(buff, 0x00, sizeof(buff));
297
298     /* Reading from a pipe */
299     read(Filedes2[0], buff, sizeof(buff));
300     ICO_DBG("buff :%s", buff);
301
302     if (atoi(buff) != 0) {
303         ICO_DBG("pulse_main Err: ret= [%d]", atoi(buff));
304         _win_del(NULL, NULL, NULL);
305     }
306
307     /* State change */
308     chg_state(STATE_STOP);
309
310     /* Process id initialization */
311     ChPid = 0;
312
313     ICO_DBG("stop_audio: Leave");
314
315     return ECORE_CALLBACK_RENEW;
316 }
317
318 static void rcv_event(int event_num)
319 {
320     ICO_DBG("rcv_event: Enter");
321
322     int ret = 0;
323
324     switch (StateNum) {
325     case STATE_START:
326         switch (event_num) {
327         case STOP_REQ:
328             /* event send */
329             send_event_req(event_num);
330             /* State change */
331             chg_state(STATE_STOP);
332             break;
333
334         case PAUSE_REQ:
335             /* event send */
336             send_event_req(event_num);
337             /* State change */
338             chg_state(STATE_PAUSE);
339             break;
340
341         default:
342             ICO_DBG("Not receive: StateNum = [%d],event_num = [%d]",
343                       StateNum, event_num);
344             break;
345         }
346
347         break;
348
349     case STATE_STOP:
350         switch (event_num) {
351         case START_REQ:
352             /* Voice reproduction start */
353             ret = start_audio();
354             if (ret == 0) {
355                 /* State change */
356                 chg_state(STATE_START);
357             }
358             else {
359                 ICO_DBG("start_audio Err: ret= [%d]", ret);
360                 _win_del(NULL, NULL, NULL);
361             }
362             break;
363
364         default:
365             ICO_DBG("Not receive: StateNum = [%d],event_num = [%d]",
366                       StateNum, event_num);
367             break;
368         }
369
370         break;
371
372     case STATE_PAUSE:
373         switch (event_num) {
374         case STOP_REQ:
375             /* event send */
376             send_event_req(event_num);
377             /* State change */
378             chg_state(STATE_STOP);
379             break;
380
381         case PAUSE_REQ:
382             /* event send */
383             send_event_req(event_num);
384             /* State change */
385             chg_state(STATE_START);
386             break;
387
388         default:
389             ICO_DBG("Not receive: StateNum = [%d],event_num = [%d]",
390                       StateNum, event_num);
391             break;
392         }
393
394         break;
395
396     default:
397         ICO_DBG("Not support StateNum: StateNum = [%d]", StateNum);
398         break;
399     }
400
401     ICO_DBG("rcv_event: Leave");
402 }
403
404 static void send_event_req(int event_num)
405 {
406     ICO_DBG("send_event_req: Enter");
407
408     char msg[32];
409     memset(msg, 0x00, sizeof(msg));
410
411     snprintf(msg, sizeof(msg), "%d", event_num);
412     ICO_DBG("msg = %s", msg);
413
414     write(Filedes[1], msg, strlen(msg) + 1);
415     ICO_DBG("send_event_req: Leave");
416 }
417
418 static void recv_event_res(int ret)
419 {
420     ICO_DBG("recv_event_res: Enter");
421
422     char msg[32];
423     memset(msg, 0x00, sizeof(msg));
424
425     snprintf(msg, sizeof(msg), "%d", ret);
426     ICO_DBG("msg = %s", msg);
427
428     write(Filedes2[1], msg, strlen(msg) + 1);
429     ICO_DBG("recv_event_res: Leave");
430 }
431
432 static void chg_state(int state_num)
433 {
434     ICO_DBG("chg_state: Enter");
435     ICO_DBG("chg_state state_num = [%d]", state_num);
436
437 //    char buf[ICO_UXF_MAX_PROCESS_NAME + 1];
438     char buf[64];
439     memset(buf, 0x00, sizeof(buf));
440
441     switch (state_num) {
442     case STATE_START:
443         snprintf(buf, sizeof(buf), "%s", "STATE : START");
444         elm_object_text_set(Ad.sts_txt, buf);
445         StateNum = state_num;
446         break;
447
448     case STATE_STOP:
449         snprintf(buf, sizeof(buf), "%s", "STATE : STOP");
450         elm_object_text_set(Ad.sts_txt, buf);
451         StateNum = state_num;
452         break;
453
454     case STATE_PAUSE:
455         snprintf(buf, sizeof(buf), "%s", "STATE : PAUSE");
456         elm_object_text_set(Ad.sts_txt, buf);
457         StateNum = state_num;
458         break;
459
460     default:
461         ICO_DBG("Not support State: state_num = [%d]", state_num);
462         break;
463     }
464
465     ICO_DBG("chg_state StateNum = [%d]", StateNum);
466     ICO_DBG("chg_state: Leave");
467 }
468
469 static void conf_check_gerror(char *para_num, GError ** error)
470 {
471     ICO_DBG("conf_check_gerror: Enter");
472
473     if (*error != NULL) {
474         ICO_DBG("Config [%s] : %s", para_num, (*error)->message);
475     }
476     g_clear_error(error);
477
478     ICO_DBG("conf_check_gerror: Leave");
479 }
480
481 static int read_config(void)
482 {
483     ICO_DBG("read_config: Enter");
484
485     GKeyFile *keyfile;
486     GKeyFileFlags flags;
487     GError *error = NULL;
488
489     keyfile = g_key_file_new();
490     flags = G_KEY_FILE_KEEP_COMMENTS | G_KEY_FILE_KEEP_TRANSLATIONS;
491     if (!g_key_file_load_from_file(keyfile, CONFIG_FILE, flags, &error)) {
492         conf_check_gerror(CONFIG_FILE, &error);
493         g_key_file_free(keyfile);
494         return -1;
495     }
496
497     AudioConfig.wavfile_path = g_key_file_get_string(keyfile, GROUP_DATA,
498                                                      KEY_WAVFILE_PATH,
499                                                      &error);
500     if ((error) || (strlen(AudioConfig.wavfile_path) <= 0)) {
501         ICO_DBG("No config data [%s]", KEY_WAVFILE_PATH);
502         conf_check_gerror(KEY_WAVFILE_PATH, &error);
503         g_key_file_free(keyfile);
504         return -1;
505     }
506
507     AudioConfig.server_ip = g_key_file_get_string(keyfile, GROUP_DATA,
508                                                   KEY_SERVER_IP, &error);
509     if ((error) || (strlen(AudioConfig.server_ip) <= 0)) {
510         ICO_DBG("No config data [%s]", KEY_SERVER_IP);
511         conf_check_gerror(KEY_SERVER_IP, &error);
512         AudioConfig.server_ip = NULL;
513     }
514
515     AudioConfig.device_name = g_key_file_get_string(keyfile, GROUP_DATA,
516                                                     KEY_DEVICE_NAME, &error);
517     if ((error) || (strlen(AudioConfig.device_name) <= 0)) {
518         ICO_DBG("No config data [%s]", KEY_DEVICE_NAME);
519         conf_check_gerror(KEY_DEVICE_NAME, &error);
520         AudioConfig.device_name = NULL;
521     }
522
523     AudioConfig.volume1 = g_key_file_get_integer(keyfile, GROUP_DATA,
524                                                  KEY_VOLUME1, &error);
525     if (error) {
526         ICO_DBG("No config data [%s]", KEY_VOLUME1);
527         conf_check_gerror(KEY_VOLUME1, &error);
528         AudioConfig.volume1 = -1;
529     }
530
531     AudioConfig.volume2 = g_key_file_get_integer(keyfile, GROUP_DATA,
532                                                  KEY_VOLUME2, &error);
533     if (error) {
534         ICO_DBG("No config data [%s]", KEY_VOLUME2);
535         conf_check_gerror(KEY_VOLUME2, &error);
536         AudioConfig.volume2 = -1;
537     }
538
539     AudioConfig.app_name = g_key_file_get_string(keyfile, GROUP_DATA,
540                                                  KEY_APP_NAME, &error);
541     if ((error) || (strlen(AudioConfig.app_name) <= 0)) {
542         ICO_DBG("No config data [%s]", KEY_APP_NAME);
543         conf_check_gerror(KEY_APP_NAME, &error);
544         AudioConfig.app_name = "TP_PulseAudio";
545     }
546
547     AudioConfig.stream_name = g_key_file_get_string(keyfile, GROUP_DATA,
548                                                     KEY_STREAM_NAME, &error);
549     if ((error) || (strlen(AudioConfig.stream_name) <= 0)) {
550         ICO_DBG("No config data [%s]", KEY_STREAM_NAME);
551         conf_check_gerror(KEY_DEVICE_NAME, &error);
552         AudioConfig.stream_name = "Pri0";
553     }
554
555     AudioConfig.repeat_flg = g_key_file_get_string(keyfile, GROUP_DATA,
556                                                     KEY_REPEAT_FLG, &error);
557     if ((error) || (strlen(AudioConfig.repeat_flg) <= 0)) {
558         ICO_DBG("No config data [%s]", KEY_REPEAT_FLG);
559         conf_check_gerror(KEY_DEVICE_NAME, &error);
560         AudioConfig.repeat_flg = "OFF";
561     }
562
563     AudioConfig.media_role = g_key_file_get_string(keyfile, GROUP_DATA,
564                                                     KEY_MEDIA_ROLE, &error);
565     if ((error) || (strlen(AudioConfig.media_role) <= 0)) {
566         ICO_DBG("No config data [%s]", KEY_MEDIA_ROLE);
567         conf_check_gerror(KEY_DEVICE_NAME, &error);
568         AudioConfig.media_role = "none";
569     }
570
571     ICO_DBG("AudioConfig.wavfile_path = [%s]", AudioConfig.wavfile_path);
572     ICO_DBG("AudioConfig.server_ip = [%s]", AudioConfig.server_ip);
573     ICO_DBG("AudioConfig.device_name = [%s]", AudioConfig.device_name);
574     ICO_DBG("AudioConfig.volume1 = [%d]", AudioConfig.volume1);
575     ICO_DBG("AudioConfig.volume2 = [%d]", AudioConfig.volume2);
576     ICO_DBG("AudioConfig.app_name = [%s]", AudioConfig.app_name);
577     ICO_DBG("AudioConfig.stream_name = [%s]", AudioConfig.stream_name);
578     ICO_DBG("AudioConfig.repeat_flg = [%s]", AudioConfig.repeat_flg);
579     ICO_DBG("AudioConfig.media_role = [%s]", AudioConfig.media_role);
580     ICO_DBG("read_config: Leave");
581     return 0;
582 }
583
584 static void draw_text(Evas_Object *obj, struct object_text_val_t *text)
585 {
586     ICO_DBG("draw_text: Enter");
587
588 //    evas_object_color_set(obj, text->color.r, text->color.g, text->color.b,
589 //                          text->color.a);
590     evas_object_resize(obj, text->size.w * W_mag, text->size.h * H_mag);
591     evas_object_move(obj, text->pos.x * W_mag, text->pos.y * H_mag);
592     evas_object_show(obj);
593     elm_object_text_set(obj, text->text);
594
595     ICO_DBG("draw_text: Leave");
596 }
597
598 static void draw_figr(Evas_Object *obj, struct object_figure_val_t *figr)
599 {
600     ICO_DBG("draw_figr: Enter");
601
602 //    evas_object_color_set(obj, figr->color.r, figr->color.g, figr->color.b,
603 //                          figr->color.a);
604     evas_object_resize(obj, figr->size.w * W_mag, figr->size.h * H_mag);
605     evas_object_move(obj, figr->pos.x * W_mag, figr->pos.y * H_mag);
606     evas_object_show(obj);
607
608     ICO_DBG("draw_figr: Leave");
609 }
610 #if 0
611 static void res_callback(ico_apf_resource_notify_info_t *info,
612                          void *user_data)
613 {
614     int ret;
615
616     ICO_DBG
617         ("##==> Callbacked! evt=%d res=%d id=%d bid=%d appid=%s dev=%s "
618          "user_data=%d", info->state, info->resid, info->id, info->bid,
619          info->appid, info->device, (int) user_data);
620
621     switch (info->state) {
622     case ICO_APF_RESOURCE_STATE_ACQUIRED:
623     case ICO_APF_RESOURCE_STATE_DEPRIVED:
624     case ICO_APF_RESOURCE_STATE_WAITTING:
625     case ICO_APF_RESOURCE_STATE_RELEASED:
626         if (info->resid == ICO_APF_RESID_INT_SOUND) {
627             ret =
628                 ico_apf_resource_reply_int_sound_mode(info->device, info->id,
629                                                       1);
630             ICO_DBG("##==> callback reply int_sound(%s,%d,1) = %d",
631                       info->device, info->id, ret);
632         }
633         else {
634             ret =
635                 ico_apf_resource_reply_sound_mode(info->device, info->id, 1);
636             ICO_DBG("##==> callback reply sound(%s,%d,1) = %d",
637                       info->device, info->id, ret);
638         }
639         break;
640     default:
641         /* NOP  */
642         break;
643     }
644 }
645 #endif
646 static void app_terminate(void *data)
647 {
648     ICO_DBG("ENTER app_terminate");
649     // Release all resources
650     int i;
651
652     if (Ad.win) {
653         evas_object_del(Ad.win);
654         Ad.win = NULL;
655     }
656
657     if (Ad.bg) {
658         evas_object_del(Ad.bg);
659         Ad.bg = NULL;
660     }
661
662     if (Ad.snd_type) {
663         evas_object_del(Ad.snd_type);
664         Ad.snd_type = NULL;
665     }
666
667     for (i = 0; i < MAX_BUTTON_NUM; i++) {
668         if (Ad.btn[i]) {
669             evas_object_del(Ad.btn[i]);
670             Ad.btn[i] = NULL;
671         }
672
673         if (Ad.btn_name[i]) {
674             evas_object_del(Ad.btn_name[i]);
675             Ad.btn_name[i] = NULL;
676         }
677
678         if (Ad.icon[i]) {
679             evas_object_del(Ad.icon[i]);
680             Ad.icon[i] = NULL;
681         }
682     }
683
684     if (Ad.sts_txt) {
685         evas_object_del(Ad.sts_txt);
686         Ad.sts_txt = NULL;
687     }
688
689     if (Ad.app_name) {
690         evas_object_del(Ad.app_name);
691         Ad.app_name = NULL;
692     }
693
694     if (Ad.strm_name) {
695         evas_object_del(Ad.strm_name);
696         Ad.strm_name = NULL;
697     }
698
699     if (Ad.pid_txt) {
700         evas_object_del(Ad.pid_txt);
701         Ad.pid_txt = NULL;
702     }
703
704     ICO_DBG("LEAVE app_terminate");
705     return;
706 }
707
708 static void _winCreate(void)
709 {
710     ICO_DBG("ENTER _winCreate");
711
712     char buf[256];
713     char buf2[256];
714     int i;
715
716     memset(buf, 0x00, sizeof(buf));
717     memset(buf2, 0x00, sizeof(buf));
718
719     if (NULL == Ad.win) {
720         ICO_DBG("Err Param NG");
721         return;
722     }
723
724     /* Sound Type  */
725     Ad.snd_type = elm_label_add(Ad.win);
726     draw_text(Ad.snd_type, &SndTypeText);
727     elm_object_text_set(Ad.snd_type, SsndType);
728
729     /* Button */
730     for (i = 0; i < MAX_BUTTON_NUM; i++) {
731         /* Button Text */
732         Ad.btn_name[i] = elm_label_add(Ad.win);
733         draw_text(Ad.btn_name[i], &ButtonText[i]);
734
735         /* Button Object */
736         Ad.btn[i] = elm_button_add(Ad.win);
737         Ad.icon[i] = elm_icon_add(Ad.win);
738         elm_icon_standard_set(Ad.icon[i], ButtonFigr[i].icon_name);
739         elm_object_part_content_set(Ad.btn[i], "icon", Ad.icon[i]);
740         draw_figr(Ad.btn[i], &ButtonFigr[i]);
741         evas_object_smart_callback_add(Ad.btn[i], "clicked",
742                                        (Evas_Smart_Cb) (ButtonFigr[i].func),
743                                        NULL);
744     }
745
746     /* Status Text */
747     Ad.sts_txt = elm_label_add(Ad.win);
748     draw_text(Ad.sts_txt, &StateInfoText);
749
750     /* Application Name */
751     Ad.app_name = elm_label_add(Ad.win);
752     draw_text(Ad.app_name, &AppNameText);
753
754     if (strlen(AudioConfig.app_name) > MAX_DRAW_LEM) {
755         snprintf(buf2, MAX_DRAW_LEM, "%s", AudioConfig.app_name);
756         snprintf(buf, sizeof(buf), "%s%s...", "App name :  ", buf2);
757     }
758     else {
759         snprintf(buf, sizeof(buf), "%s%s", "App name :  ",
760                  AudioConfig.app_name);
761     }
762     elm_object_text_set(Ad.app_name, buf);
763
764     /* Stream Name */
765     Ad.strm_name = elm_label_add(Ad.win);
766     draw_text(Ad.strm_name, &StreamNameText);
767
768     if (strlen(AudioConfig.stream_name) > MAX_DRAW_LEM) {
769         snprintf(buf2, MAX_DRAW_LEM, "%s", AudioConfig.stream_name);
770         snprintf(buf, sizeof(buf), "%s%s...", "Stream name :  ", buf2);
771     }
772     else {
773         snprintf(buf, sizeof(buf), "%s%s", "Stream name :  ",
774                  AudioConfig.stream_name);
775     }
776     elm_object_text_set(Ad.strm_name, buf);
777
778     /* PID Text */
779     Ad.pid_txt = elm_label_add(Ad.win);
780     draw_text(Ad.pid_txt, &PidText);
781     snprintf(buf, sizeof(buf), "%s%d", "PID :  ", getpid());
782     elm_object_text_set(Ad.pid_txt, buf);
783
784     ICO_DBG("LEAVE _winCreate");
785     return;
786 }
787
788 static void _win_del(void *data, Evas_Object *obj, void *event_info)
789 {
790     ICO_DBG("ENTER _win_del");
791
792     elm_exit();
793
794     ICO_DBG("LEAVE _win_del");
795     return;
796 }
797
798 static Evas_Object *_create_win(const char *name)
799 {
800     ICO_DBG("ENTER _create_win");
801
802     Evas_Object *eo;
803     eo = elm_win_add(NULL, name, ELM_WIN_BASIC);
804     if (eo) {
805         elm_win_title_set(eo, name);
806         evas_object_smart_callback_add(eo, "delete,request", _win_del, NULL);
807     }
808     ICO_DBG("LEAVE _create_win");
809
810     return eo;
811 }
812
813 static bool app_create(void *data)
814 {
815     ICO_DBG("ENTER app_create");
816
817 #if 0 //TEST.s
818     int w, h;
819
820     /* get display size */
821     ecore_x_window_size_get(ecore_x_window_root_first_get(), &w, &h);
822     ICO_DBG("window size w=%d,h=%d", w, h);
823
824     /* set app screen size */
825     Width = w;
826     Height = h - STATUS_BAR_HEIGHT;
827 #else
828     Width = WIDTH;
829     Height = HEIGHT;
830 #endif //TEST.e
831
832     W_mag = Width / WIDTH;
833     H_mag = Height / HEIGHT;
834
835     ICO_DBG("Width =%f,Height=%f", Width, Height);
836     ICO_DBG("W_mag =%f,H_mag=%f", W_mag, H_mag);
837
838     /* main widnow */
839     Ad.win = _create_win(MODULE_NAME);
840     if (Ad.win == NULL) {
841         return FALSE;
842     }
843     evas_object_show(Ad.win);
844
845     elm_win_indicator_mode_set(Ad.win, ELM_WIN_INDICATOR_SHOW);
846     elm_win_fullscreen_set(Ad.win, EINA_TRUE);
847
848     Ad.bg = elm_bg_add(Ad.win);
849     elm_win_resize_object_add(Ad.win, Ad.bg);
850     evas_object_size_hint_weight_set(Ad.bg, EVAS_HINT_EXPAND,
851                                      EVAS_HINT_EXPAND);
852     elm_bg_file_set(Ad.bg, BG_IMAGE_FILE, NULL);
853     evas_object_show(Ad.bg);
854
855     evas_object_resize(Ad.win, Width, Height);
856
857     /* set font size */
858     (void)elm_config_font_overlay_set(TEXT_BUTTON, FONT_FAMILY, FONT_SIZE);
859     (void)elm_config_font_overlay_set(TEXT_LABEL, FONT_FAMILY, FONT_SIZE);
860     (void)elm_config_font_overlay_apply();
861
862     _winCreate();
863
864     ICO_DBG("LEAVE app_create");
865
866     return TRUE;                /* EXIT_SUCCESS */
867 }
868
869 #if 0
870 static int get_sound(int argc, char **argv)
871 {
872     ICO_DBG("ENTER get_sound");
873
874     int getsound;
875     bundle *b;
876     const char *val;
877
878     /* get resource control option  */
879     b = bundle_import_from_argv(argc, argv);
880     getsound = 0;
881     SsndType[0] = 0;
882     if (b != NULL) {
883         val = bundle_get_val(b, "rightoption");
884         if (val != NULL) {
885             if (strcasecmp(val, "-basesound") == 0) {
886                 getsound = 1;   /* get base sound       */
887                 strcpy(SsndType, "BaseSound");
888             }
889             else if (strcasecmp(val, "-intsound") == 0) {
890                 getsound = 2;   /* get interrupt sound  */
891                 strcpy(SsndType, "IntSound");
892             }
893             else if (strncasecmp(val, "-int=", 5) == 0) {
894                 getsound = strtol(val + 5, (char **) 0, 0);
895                 getsound += 2;  /* get interrupt sound  */
896                 sprintf(SsndType, "IntSound.%d", getsound - 2);
897             }
898         }
899     }
900
901     if (getsound > 0) {
902         /* initialize resource control for Ecore */
903         if (ico_apf_ecore_init(NULL) != ICO_APF_E_NONE) {
904             ICO_DBG("ico_apf_ecore_init() Error");
905             ecore_evas_shutdown();
906             return -1;
907         }
908
909         /* set resource request callback */
910         ico_apf_resource_set_event_cb(res_callback, NULL);
911
912         /* acquire a right to display a screen      */
913         if (getsound == 1) {
914             ico_apf_resource_get_sound_mode(NULL, 0, 0);
915         }
916         else {
917             ico_apf_resource_get_int_sound_mode(NULL, getsound - 2, 0);
918         }
919     }
920     ICO_DBG("LEAVE get_sound");
921     return 0;
922 }
923 #endif
924
925 int main(int argc, char *argv[])
926 {
927 //    char appid[ICO_UXF_MAX_PROCESS_NAME + 1];
928     char appid[256];
929     int pid;
930     app_event_callback_s event_callback;
931     int result = 0;
932
933     /* Setting the log output */
934 //    if (ico_apf_get_app_id(0, appid) == ICO_APP_CTL_E_NONE) {
935 //        ico_apf_log_open(appid);
936 //    }
937
938     /* Setting the log output */
939     memset(appid, 0, sizeof(appid));
940     pid = getpid();
941     if (aul_app_get_appid_bypid(pid, appid, sizeof(appid)) == AUL_R_OK) {
942         ico_log_open(appid);
943     }
944     else {
945         ico_log_open(MODULE_NAME);
946     }
947
948     ICO_INF("START_MODULE %s", MODULE_NAME);
949     ICO_DBG("ENTER main");
950
951     if (pipe(Filedes) == -1) {
952         ICO_DBG("Err pipe Filedes");
953         return EXIT_FAILURE;
954     }
955
956     if (pipe(Filedes2) == -1) {
957         ICO_DBG("Err pipe Filedes2");
958         return EXIT_FAILURE;
959     }
960
961     if (read_config() == -1) {
962         ICO_DBG("Err Config Read NG");
963         return EXIT_FAILURE;
964     }
965
966     if (!ecore_evas_init()) {
967         return EXIT_FAILURE;
968     }
969
970     /* get argument */
971 //    if (get_sound(argc, argv) != 0) {
972 //        ICO_DBG("Err get_sound");
973 //        return EXIT_FAILURE;
974 //    }
975
976     /* File descriptor to monitor callback function entry */
977     ecore_main_fd_handler_add(Filedes2[0], ECORE_FD_READ, stop_audio, NULL,
978                               NULL, NULL);
979
980     /* set callback fanc */
981     event_callback.create = app_create;
982     event_callback.terminate = app_terminate;
983     event_callback.pause = NULL;
984     event_callback.resume = NULL;
985     event_callback.service = NULL;
986     event_callback.low_memory = NULL;
987     event_callback.low_battery = NULL;
988     event_callback.device_orientation = NULL;
989     event_callback.language_changed = NULL;
990     event_callback.region_format_changed = NULL;
991
992     memset(&Ad, 0x0, sizeof(struct appdata_t));
993
994     result = app_efl_main(&argc, &argv, &event_callback, &Ad);
995
996 //    ico_apf_ecore_term();
997     ecore_evas_shutdown();
998
999     close(Filedes[0]);
1000     close(Filedes[1]);
1001     close(Filedes2[0]);
1002     close(Filedes2[1]);
1003
1004     /* Process check */
1005     if ((ChPid > 0) && (kill(ChPid, 0) != EOF)) {
1006         kill(ChPid, SIGKILL);
1007         ICO_DBG("END Process ChPid = [%d]", ChPid);
1008     }
1009     ICO_DBG("main: Leave");
1010     ICO_INF("END_MODULE %s", MODULE_NAME);
1011     return result;
1012 }