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