Воспроизведение аудио
Загрузка аудиофайлов
Когда компания Sony выпустила портативное аудиоустройство в 1979 году, маркетологи давали отрицательные прогнозы популярности кассетного аудиоплеера. Однако, это не остановило президента Sony Ориту, и он запустил в серию Walkman, который вскоре стал бестселлером. В 21-м веке Стив Джобс выпустил портативный mp3-плеер iPod, который тоже приобрел огромную популярность. В настоящее время стало гораздо удобнее воспроизводить музыку на смартфонах. Дл воспроизведения аудио и видео используются специальные приложения. На этом занятии мы займемся приложением, воспроизводящим аудиофайлы.
Создайте новое приложение ‘AudioPlayerSample'. Для работы примера нам понадобятся два аудиофайла: "1.aac" и "1.mp3". Сочините музыку сами или скачайте файлы с Интернета. Далее, файлы нужно скопировать в папку /res нашего проекта.
Откройте файл исходного кода и внесите следующие изменения в начале файла.
#include "audioplayersample.h" #include <player.h> typedef struct appdata { Evas_Object *win; Evas_Object *conform; Evas_Object *label; player_h player; } appdata_s; const char* file_name[] = { "1.aac", "1.mp3" };
player_h — это структура Player, воспроизводящая медиа файлы, такие как аудио и видео.
file_name[] - это массив строк, в котором хранятся названия файлов. При загрузке приложения будет автоматически создаваться объект Player и загружаться первый аудио файл. Добавьте новый код в конце функции create_base_gui().
evas_object_show(ad->win); // Create Player ad->player = create_player(); // Load audio file to Player prepare_player(ad, 0);
Функция create_player() создает объект Player, поскольку функция prepare_player() загружает аудиофайл. Добавьте шесть функций выше create_base_gui().
// Get player state static player_state_e get_player_state(player_h player) { player_state_e state; player_get_state(player, &state); return state; } // Play completed event function static void on_player_completed(player_h* player) { if(player) player_stop(player); } // Create Player static player_h create_player() { player_h player; player_create(&player); player_set_completed_cb(player, on_player_completed, player); return player; } // Stop play static void stop_player(void *data, Evas_Object *obj, void *event_info) { appdata_s *ad = data; if( get_player_state(ad->player) == PLAYER_STATE_PLAYING || get_player_state(ad->player) == PLAYER_STATE_PAUSED) { player_stop(ad->player); } } // Get full path of source file static inline const char* get_resource_path(const char *file_path) { static char absolute_path[PATH_MAX] = {'\0'}; static char *res_path_buff = NULL; if(res_path_buff == NULL) res_path_buff = app_get_resource_path(); snprintf(absolute_path, PATH_MAX, "%s%s", res_path_buff, file_path); return absolute_path; } // Load file to Player static void prepare_player(appdata_s* ad, int index) { // Stop play stop_player(ad, NULL, NULL); // Close file player_unprepare(ad->player); const char* file = file_name[index]; // Get full path of source file const char *res_path = get_resource_path(file); // Load file player_set_uri(ad->player, res_path); // Prepare play int result = player_prepare(ad->player); dlog_print(DLOG_INFO, "tag", "File load : %d", result); }
Воспроизведение аудио
Далее, мы реализуем возможность воспроизведения аудио при нажатии на кнопку. Добавьте новую функцию выше create_base_gui() function. Эта функция добавит контрол в контейнер Box.
static void my_box_pack(Evas_Object *box, Evas_Object *child, double h_weight, double v_weight, double h_align, double v_align) { /* create a frame we shall use as padding around the child widget */ Evas_Object *frame = elm_frame_add(box); /* use the medium padding style. there is "pad_small", "pad_medium", * "pad_large" and "pad_huge" available as styles in addition to the * "default" frame style */ elm_object_style_set(frame, "pad_medium"); /* set the input weight/aling on the frame insted of the child */ evas_object_size_hint_weight_set(frame, h_weight, v_weight); evas_object_size_hint_align_set(frame, h_align, v_align); { /* tell the child that is packed into the frame to be able to expand */ evas_object_size_hint_weight_set(child, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); /* fill the expanded area (above) as opposaed to center in it */ evas_object_size_hint_align_set(child, EVAS_HINT_FILL, EVAS_HINT_FILL); /* actually put the child in the frame and show it */ evas_object_show(child); elm_object_content_set(frame, child); } /* put the frame into the box instead of the child directly */ elm_box_pack_end(box, frame); /* show the frame */ evas_object_show(frame); }
Добавьте код в функцию create_base_gui(). Этот код добавит кнопку к контейнеру Box.
/* Conformant */ ad->conform = elm_conformant_add(ad->win); elm_win_indicator_mode_set(ad->win, ELM_WIN_INDICATOR_SHOW); elm_win_indicator_opacity_set(ad->win, ELM_WIN_INDICATOR_OPAQUE); evas_object_size_hint_weight_set(ad->conform, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); elm_win_resize_object_add(ad->win, ad->conform); evas_object_show(ad->conform); { /* child object - indent to how relationship */ Evas_Object * box, *btn; /* A box to put things in verticallly - default mode for box */ box = elm_box_add(ad->win); evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); elm_object_content_set(ad->conform, box); evas_object_show(box); { /* child object - indent to how relationship */ /* Label*/ ad->label = elm_label_add(ad->win); elm_object_text_set(ad->label, "<align=center>Playing audio sample</>"); /* expand horizontally but not vertically, and fill horizontally, * align center vertically */ my_box_pack(box, ad->label, 1.0, 0.0, -1.0, 0.0); /* Play Button */ btn = elm_button_add(ad->win); elm_object_text_set(btn, "Play"); evas_object_smart_callback_add(btn, "clicked", start_player, ad); my_box_pack(box, btn, 1.0, 0.0, -1.0, 0.0); } } /* Show window after base gui is set up */ evas_object_show(ad->win);
Создадим функцию вызова для кнопки. Создайте функцию выше create_base_gui().
// Start play static void start_player(void *data, Evas_Object *obj, void *event_info) { appdata_s *ad = data; if( get_player_state(ad->player) != PLAYER_STATE_PLAYING) player_start(ad->player); }
Функция start_player() запускает воспроизведение аудио.
player_start(player_h) - это API, который воспроизводит аудио.
Запустите пример.
Пауза и остановка воспроизведения
Для реализации функций паузы и остановки мы добавим две кнопки. Добавим код в функцию the create_base_gui().
/* Play Button */ btn = elm_button_add(ad->win); elm_object_text_set(btn, "Play"); evas_object_smart_callback_add(btn, "clicked", start_player, ad); my_box_pack(box, btn, 1.0, 0.0, -1.0, 0.0); /* Pause Button */ btn = elm_button_add(ad->win); elm_object_text_set(btn, "Pause"); evas_object_smart_callback_add(btn, "clicked", pause_player, ad); my_box_pack(box, btn, 1.0, 0.0, -1.0, -1.0); /* Stop Button */ btn = elm_button_add(ad->win); elm_object_text_set(btn, "Stop"); evas_object_smart_callback_add(btn, "clicked", stop_player, ad); my_box_pack(box, btn, 1.0, 0.0, -1.0, -1.0); } }
Теперь у нас есть две кнопки. Нам нужны обработчики событий нажатия на кнопки. Добавим новый код выше функции create_base_gui().
// Pause play static void pause_player(void *data, Evas_Object *obj, void *event_info) { appdata_s *ad = data; if( get_player_state(ad->player) == PLAYER_STATE_PLAYING ) player_pause(ad->player); }
Запустите проект
Смена аудиофайлов
Теперь мы реализуем возможность смены аудиофайлов с помощью двух кнопок. Добавим код в функцию create_base_gui().
/* Label*/ ad->label = elm_label_add(ad->win); elm_object_text_set(ad->label, "<align=center>Playing audio sample</>"); /* expand horizontally but not vertically, and fill horiz, * align center vertically */ my_box_pack(box, ad->label, 1.0, 0.0, -1.0, 0.0); /* File Load-1 Button */ btn = elm_button_add(ad->win); elm_object_text_set(btn, "File-1"); evas_object_smart_callback_add(btn, "clicked", btn_load_file1, ad); /* epand both horiz and vert, fill horiz and vert */ my_box_pack(box, btn, 1.0, 0.0, -1.0, -1.0); /* File Load-2 Button */ btn = elm_button_add(ad->win); elm_object_text_set(btn, "File-2"); evas_object_smart_callback_add(btn, "clicked", btn_load_file2, ad); my_box_pack(box, btn, 1.0, 1.0, -1.0, 0.0); /* Play Button */ btn = elm_button_add(ad->win); elm_object_text_set(btn, "Play"); evas_object_smart_callback_add(btn, "clicked", start_player, ad); my_box_pack(box, btn, 1.0, 0.0, -1.0, 0.0);
Добавим обработчики событий для этих кнопок выше функции create_base_gui().
static void btn_load_file1(void *data, Evas_Object *obj, void *event_info) { appdata_s *ad = data; // Load file to Player prepare_player(ad, 0); } static void btn_load_file2(void *data, Evas_Object *obj, void *event_info) { appdata_s *ad = data; // Load file to Player prepare_player(ad, 1); }
Запустите проект