Опубликован: 22.12.2015 | Уровень: для всех | Доступ: платный
Лекция 28:

Воспроизведение аудио

< Лекция 27 || Лекция 28 || Лекция 29 >

Загрузка аудиофайлов

Когда компания 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);
}

Запустите проект


< Лекция 27 || Лекция 28 || Лекция 29 >