Разработка цифрового проигрывателя с графическим интерфейсом

Проведение исследования модели музыкального плеера в программе Simulink. Анализ возможных путей выполнения на высокоуровневом языке. Осуществление звукового потока и привязка к интерфейсу. Смена значения задержки звука и наблюдение за изменениями.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 26.10.2017
Размер файла 425,1 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Московский Государственный Технический Университет

имени Н.Э. Баумана

Курсовая работа

по курсу «Цифровая обработка сигналов»

Разработка цифрового проигрывателя с графическим интерфейсом

Студент:

Лемберский А.А.

Руководитель:

Недашковский В.М.

МОСКВА 2013

Содержание

1. Техническое задание

2. Теоретическая часть

2.1 Описание звукового эффекта

2.2 Модель музыкального плеера в Simulink

2.3 Возможные пути выполнения на высокоуровневом языке

3. Практическая часть

3.1 Реализация интерфейса плеера

3.2 Итоги

Список использованной литературы, источники и инструменты

1. Техническое задание

1. Разработать модель цифрового аудио проигрывателя в пакете Matlab, реализующую заданный звуковой эффект.

2. Разработать программу цифрового аудио проигрывателя с графическим эквалайзером и с поддержкой заданного звукового эффекта.

Условия задания для варианта 35:

· Звуковой эффект: phaser

· Количество полос графического эквалайзера: 7

Базовые функции медиаплеера:

1. Графический интерфейс

2. Открытие файлов из графического интерфейса

3. Воспроизведение музыки разных форматов

4. Включение и отключение эффекта

5. Изменение громкости

6. Управление параметрами эффекта

7. Перемещение по треку

8. Графический эквалайзер

2. Теоретическая часть

2.1 Описание звукового эффекта

Phaser является своеобразным преобразователем звукового сигнала. Он осуществляется путем фильтрации звука, создавая серии максимумов и минимумов в его частотном спектре. На протяжении звучания положение этих пиков и впадин может варьироваться, что позволяет создавать специфический круговой эффект.

Образно говоря, для того, чтобы ощутить фэйзер в обычной обстановке, человеку, сидящему, например, необходимо начать как можно чаще вертеть головой из стороны в сторону.

Эффект досигается путем электронного разбиения аудиосигнала на два потока. Один, проходя через фильтр с нелинейной фазой, сохраняет частоту и амплитуду исходного звука, но изменяет свою фазу только на определенной частоте. Затем, после смешивания исходного и обработанного сигналов, частоты, которые находятся в противофазе, гасят друг друга, создавая тем самым характерные впадины в звуковом спектре. Таким образом, изменение соотношения обоих сигналов меняет глубину эффекта.

По принципу работы phaser схож с chorus и отличается от него временем задержки (1-5 мс). Помимо этого задержка сигнала у phaser на разных частотах неодинакова и меняется по определённому закону.

В обычных условиях человеческое ухо практически не способно распознавать изменение фаз, однако оно может воспринять этот эффект, когда происходит смешивание обработанного и исходного сигналов (интерференция). При этом возникает эффект металлического звука или речи робота.

В качестве примера хорошо реализованного эффекта phaser предлагаю послушать песню

Ѓф Electrafixion - Sister Pain

Гитара в ней звучит именно в заданном стиле.

Кроме эффекта phaser существуют еще эффекты flanger и chorus, которые выполнены по такой же схеме, единственная разница в задержке и коэффициента обратной связи.

Сказать по правде, неподготовленному человеку будет крайне сложно отличить эти эффекты друг от друга.

В следующем разделе я покажу вам схему этого эффекта, выполненную в математическом пакете Matlab в среде моделирования Simulink

2.2 Модель музыкального плеера в Simulink

Matlab - отличный пакет для решения математических задач. Мы воспользуемся им для моделирования нашего музыкального плеера с эффектом phaser.

Приступим к реализации нашего эффекта.

Еще раз повторяя сказанное ранее, мы должны разделить поток на два или несколько, один пустить без искажений, а на другие наложить небольшую временную задержку. Затем все сигналы суммируются и выводятся в аудиоустройство.

Вот как выглядит схема, собранная в симулинке.

Рис. 1

Остановимся поподробнее на каждом элементе этой схемы.

Рис. 2

Этот элемент позволяет нам указать путь к нашему аудиофайлу и использовать его в качестве сигнала.

Зайдем в его настройки:

Рис. 3

Самый главный параметр здесь - Samples per audio frame. Ставим его в единицу. Что такое sample и frame? Это базовые понятия в цифровой обработке музыкальных сигналов. Отцифрованный звук поступает в виде числовых отчетов непрерывным потоком. Для удобства обработки эти отсчеты формируются в массивы, sample (сэмплы). Сэмплы в свою очередь группируются в двумерную матрицу (frame). Поставив единицу в эту графу, мы объявили, что фрейм у нас будет состоять всего из одного сэмпла, т.е. фактически не будет отличаться от него.

Рис. 4

Блок Delay определяет задержку звукового сигнала. Индекс 0 в показатели степени означает, что задержки не будет и сигнал без искажений пройдет через этот блок. Задержка измеряется в сэмплах. В 1 сэмпле 8 бит = 1 байт информации. Для нашего не совсем качественного mp3 файла при частоте дискретизации 44 кГц необходима передача данных хотя бы 128 кбит/с. Таким образом происходит передача около 16000 сэмплов в секунду. Варьируя задержку в блоке Delay мы можем добиться нужного нам звучания.

Рис. 5

Это окно настроек блока Delay.

Мы можем менять параметры Delay (samples) от 0 до неограниченного числа, но запомните, что при 16000 у нас будет задержка ровно на секунду в музыке, а нам нужна задержка гораздо меньшая.

Как видно из Рис 1, сигнал разделяется на 6 потоков, один который без блока задержки, а 5 остальных с таким блоком. Потом все сигналы суммируются при помощи сумматора.

В конце суммирующий сигнал выводится на аудиоустройство пр помощи блока to audio device

Теперь для задания нашего эффекта phaser установим в блоках delay следующие значения:

Delay1 1000

Delay2 2000

Delay3 3000

Delay4 4000

Delay5 5000

Звук приобрел характерный металлический оттенок. Вы можете сами попробовать поменять значения задержки и понаблюдать за изменениями.

Теперь приступим к реализации схемы нашего плеера с эквалайзером. В прошлом семестре мы выполняли аналогичную работу, поэтому я не буду вдаваться в подробности проектирования эквалайзера. Полученная итоговая схема:

Как видно из рисунка, звук разделяется на 7 потоков и каждый идет через свой фильтр, каждый из которых проектируется в специальном инструмент matlab fdatool. После чего звук поступает в блок gain, который либо усиливает его, либо ослабевает. Таким образом мы можем отрегулировать звучание по частотам, сделать его высотным или басовым.

Рис. 6

Для отладки и наглядного тестирования эффекта phaser я быстро создал пользовательский интерфейс в инструменте matlab guide

Подробный код описан в прошлом семестре, скажу только, что вертикальные ползунки управляют усилением полос, каждый в своем диапазоне частот от BASS до TOP OCTAVE

Возможные значения усиления от -10 до +10 дБ

Кнопка default возвращает значения усиления всех полос в 0 дБ

Горизонтальные ползунки управляют задержкой звукового сигнала, каждый своим потоком. Возможные значения задержки от 0 до 16000 сэмплов в каждом из потоков. Кнопка swith phaser off возвращает значение задержки в 0.

Таким образом, можно пробовать изменять значения очень быстро и динамично для нахождения оптимального звучания.

Теперь, когда мы разобрались с устройством нашего проигрывателя и со схемой нашего эффекта, можно смело приступать к его разработке на языке высокого уровня.

2.3 Возможные пути выполнения на высокоуровневом языке

Для начала необходимо определиться с выбором операционной системы, на которой будем выполнять работу. В методических указаниях для каждой ОС были рекомендованы свои инструменты, а именно:

1. Для Windows самая рациональная связка - Visual Studio, WinForms, DirectShow.

2. Для Mac OS X - XCode, Cocoa, CoreAudio.

3. Для Linux - Geany, GTK, Gstreamer.

В моем активе были все 3 операционные системы, но я решил начать с самой распространенной - Windows, тем более, что мы неплохо освоили в свое время Visual Studio и WinForms. К моему сожалению, поставить DirectShow не удалось, спросить было не у кого, поэтому это быстро мне отбило охоту.

Что касается Mac OS и в частности CoreAudio, мне удалось наткнуться на отличную книгу,

Learning Core Audio: A Hands-On Guide to Audio Programming for Mac and iOS [Chris Adamson, Kevin Avila]

Я прочитал введение на русском языке, автор готовит читателей к решению сложных задач на достаточно низком уровне программирования, предполагает знания objective c и библиотек cocoa. Я решил подтянуть свои знания, поставил XCode, прочитал небольшую, но хорошо написанную книгу по objective C

Become an Xcoder. Start Programming the Mac Using Objective-C. By Bert Altenberg, Alex Clarke and Philippe Mougin

Рекомендую тем, кто хочет быстро научиться что-либо писать на Mac и OS X

Кроме того, я прослушал видеокурс по библиотекам cocoa на youtube, там их достаточное количество.

К моему разочарованию, дальше работа не двинулась, т.к. после русского предисловия книги мне предложили заказать такую книгу, чего я делать не стал, а в сети найти удалось только англоязычный вариант, который для изучения был весьма непрост. Тем не менее, у меня твердо сложилось убеждение, что CoreAudio определенно лучший инструмент для создания мультимедийных приложений. Появилось желание это изучить, чем я возможно займусь, когда появится время.

Итак, остается Linux, система, с которой я был не знаком до сиз пор, но проект выполнил именно на ней. Тут были уже люди, у кого можно спросить и получить вразумительный ответ. Я установил Ubuntu, Geany - компилятор языка С, библиотеки gstreamer и gtk.

Я и моя коллега Евгения Ахунзянова написали подробную инструкцию, как все это устанавливается и компилируется на Linux. Это можно найти в самой последней версии методички.

Как устанавливать Linux на компьютер мы описывать не стали, т.к. все это подробно рассказывается на курсе Технологии Программирования.

Хоть это и было подчеркнуто в методичке, но позволю повториться себе еще раз про gtk и gstreamer.

Это не какие-то программы, где вы можете себе взять и создать плеер или что-то еще. Это просто библиотеки различных функций и объектов, которые можно подключить к среде программирования и использовать в своих проектах на языке С.

Gstreamer - мультимедийный фреймворк, написаный на языке C и использующий систему типов GObject. Используется в различных плеерах, редакторах, программах для создания конференций и портативных устройствах. Документацию на него можно найти по адресу:

Все на английском, поиск непростой, но реальный и все описания и даже примеры кодов там есть.

Как работает звуковой поток в Gstreamer описано в методичке.

Что касается gtk, это тоже библиотеки, только интерфейса.

Документацию можно найти здесь:

Наряду с библиотеками интерфейса gtk я рекомендую обратить внимание на библиотеки Qt. Описание происходит на языке С++

Я немного поразбирался с этими библиотеками для системы Mac OS, очень просто в освоении, только вопрос о связи с gstreamer или другими инструментами остается открытым.

Такой простенький интерфейс можно написать буквально за пару минут. Кому интересно, советую обратить внимание. На youtube можно найти множество видеокурсов по програмированию на С++ с использованием библиотек Qt

Теперь, когда мы знаем возможные пути развития, можно уже остановится конкретно на нашем методе реализации, а именно:

Ubuntu + geany + gstreamer + gtk на языке С.

3. Практическая часть

3.1 Реализация интерфейса плеера

Наш проект будет состоять из двух файлов, один будет содержать описания интерфейса, а второй - основную программу, реализующую звуковой поток. Файл для описания интерфейса называется playerinterf.c, файл для самой программы gsprog.c

Для подробного описания своих действий я буду прикладывать кусочки кода и комментировать свои действия. Для начала обсудим создание интерфейса плеера.

Подключаем библиотеки, необходимые для реализации.

#include <stdio.h> //Подключаем стандартные функции i/o

#include <gtk/gtk.h> //библиотеки интерфейса

#include <gst/gst.h> //библиотеки gstreamer

#include "gsprog.c" //ссылка на основную программу

//описание функции выбора музыкального файла static void file_select(GtkFileChooser *selector, gpointer data);

//объявление глобальных переменных в виде указателей

GtkAdjustment *adj[7], *adj_progress;

GtkWidget *window, *hbox1, *hbox2, *hbox3, *hbox4, *vbox;

GtkWidget *scale[7], *check, *explorer, *progress, *file_filter, *time_display;

GtkToolItem *btnPlay, *btnStop, *btnPause;

ToolItem - уже библиотечные кнопки для проигрывания, паузы и остановки

Widget - самые разные объекты интерфейса, окна, контейнеры, кнопки и т.д.

Теперь начинается выполнение главной функции:

int main(int argc, char **argv)

{

//инициализируем GTK+ и GStreamer

gtk_init(&argc, &argv);

gst_init(&argc, &argv);

Две последнии строчки необходимы для инициализации наших библиотек.

/*-----------------------------------------------------

СОЗДАЕМ ЭЛЕМЕНТЫ ИНТЕРФЕЙСА

------------------------------------------------------*/

//наше основное окно

window = gtk_window_new(GTK_WINDOW_TOPLEVEL);

//сразу устанавливаем отступы 10 пикселей от края окна

gtk_container_set_border_width(GTK_CONTAINER(window), 10);

//основной контейнер, куда всё будет заполняться

//VERTICAL - все элементы будут заполняться вертикально

//Параметр 10 указывает на расстояние между элементами в этом //контейнере

vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 10);

//контейнер для кнопки выборки файла

hbox4 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 70);

//контейнер для кнопок play, stop и pause

hbox1 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 50);

//контейнер для ползунка поиска по треку, кнопки эффекта phaser и //громкости

hbox2 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 15);

//контейнер для ползунков эквалайзера

hbox3 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 20);

//задаем размер для основного контейнера

gtk_widget_set_size_request(vbox, 500, 300);

//размер для окна с эквалайзером

gtk_widget_set_size_request(hbox3, 100, 200);

//кнопка включения и выключения эффекта phaser

check = gtk_check_button_new_with_label("phaser");

//кнопка регулировки громкости

GtkWidget *volume;

volume = gtk_volume_button_new();

//кнопка выбора файла

explorer = gtk_file_chooser_button_new("select file", GTK_FILE_CHOOSER_ACTION_OPEN);

//кнопки воспроизведение, стоп и пауза

btnPlay = gtk_tool_button_new_from_stock(GTK_STOCK_MEDIA_PLAY);

btnStop = gtk_tool_button_new_from_stock(GTK_STOCK_MEDIA_STOP);

btnPause = gtk_tool_button_new_from_stock(GTK_STOCK_MEDIA_PAUSE);

//этими функциями мы масштабируем данные кнопки при растяжении окна

gtk_widget_set_hexpand (btnPlay, TRUE);

gtk_widget_set_hexpand (btnStop, TRUE);

gtk_widget_set_hexpand (btnPause, TRUE);

//создаем лэйбл для отображения времени трека

time_display = gtk_label_new ("0:00 / 0:00");

//задаем регулятор (value, lower, upper, step_incr, page_incr, page_size)

adj_progress = gtk_adjustment_new (0.0, 0.0, 100.0, 0.1, 1.0, 0.0);

//привязываем его к горизонтальному ползунку

progress = gtk_scale_new(GTK_ORIENTATION_HORIZONTAL, adj_progress);

//масштабирование ползунка

gtk_widget_set_hexpand(progress, TRUE);

//масштабирование кнопки

gtk_widget_set_hexpand(explorer, TRUE);

//вывод времени прогресса

gtk_scale_set_draw_value (GTK_SCALE(progress), FALSE);

//фильтр файлов создание и название

file_filter = GTK_WIDGET(gtk_file_filter_new());

gtk_file_filter_set_name (GTK_FILE_FILTER(explorer), "Music");

//возможные музыкальные форматы для воспроизведения и

gtk_file_filter_add_pattern (GTK_FILE_FILTER(file_filter), "*.flac");

gtk_file_filter_add_pattern (GTK_FILE_FILTER(file_filter), "*.mp3");

//реализация фильтра

gtk_file_chooser_add_filter (GTK_FILE_CHOOSER(explorer), GTK_FILE_FILTER(file_filter));

gtk_file_chooser_set_filename (GTK_FILE_CHOOSER(explorer), DEFAULT_FILE);

//зарисовка 7 полос эквалайзера

int i; музыкальный плеер интерфейс звуковой

for (i = 0; i < 7; i ++) {

//7 регулируемых значений от -12 до 10 с шагом 1.0

adj[i] = gtk_adjustment_new(0.0, -12.0, 10.0, 1.0, 1.0, 0.0);

//7 ползунков вертикальной ориентации

scale[i] = gtk_scale_new(GTK_ORIENTATION_VERTICAL, adj[i]);

//максимум сверху, минимум снизу

gtk_range_set_inverted(GTK_RANGE(scale[i]), TRUE);

//сразу добавляем в контейнер hbox3

gtk_container_add(GTK_CONTAINER(hbox3), scale[i]);

//масштабирование ползунков

gtk_widget_set_vexpand(scale[i], TRUE);

gtk_widget_set_hexpand(scale[i], TRUE);

}

/*--------------------------------------------------------------------------------

ЗАПОЛНЯЕМ КОНТЕЙНЕР, НАНОСИМ КНОПКИ НА ФОРМУ

---------------------------------------------------------------------------------*/

//элементы наносятся в порядке выполнения кода, один за другим

gtk_container_add(GTK_CONTAINER(hbox1), btnPlay);

gtk_container_add(GTK_CONTAINER(hbox1), btnPause);

gtk_container_add(GTK_CONTAINER(hbox1), btnStop);

gtk_container_add(GTK_CONTAINER(hbox2), time_display);

gtk_container_add(GTK_CONTAINER(hbox2), progress);

gtk_container_add(GTK_CONTAINER(hbox2), check);

gtk_container_add(GTK_CONTAINER(hbox2), volume);

gtk_container_add(GTK_CONTAINER(hbox4), explorer);

gtk_container_add(GTK_CONTAINER(vbox),hbox4);

gtk_container_add(GTK_CONTAINER(vbox),hbox2);

gtk_container_add(GTK_CONTAINER(vbox),hbox3);

gtk_container_add(GTK_CONTAINER(vbox),hbox1);

//основной контейнер добавляется в окно

gtk_container_add(GTK_CONTAINER(window),vbox);

Следующий кусок кода может показаться не совсем понятным без привязки к основной функции, просто представьте сейчас, что там существуют какие-то функции, куда происходит передача параметров из интерфейса.

/*-----------------------------------------------------------------------------------

ОБРАБОТКА СИГНАЛОВ, СВЯЗЬ ИНТЕРФЕЙСА С GSTREAMER

--------------------------------------------------------------------------------------*/

//обработчик ползунка по треку

g_signal_connect(adj_progress, "value-changed", G_CALLBACK(gstreamer_seek_to_time), NULL);

//обработчик громкости сигнала

g_signal_connect(volume, "value-changed", G_CALLBACK(gstreamer_volume), NULL);

//обработчик выбора файла

g_signal_connect(explorer, "selection_changed", G_CALLBACK(file_select), NULL);

//обработчик эквалайзера

int n;

gpointer num;

for (n = 0; n < 7; n ++) {

num = GINT_TO_POINTER(n);

//передает значение усиления снятое с ползунка g_signal_connect(adj[n], "value-changed", G_CALLBACK(gstreamer_equalizer), num);

}

//обработчик эффекта phaser, следит, включен ли он

g_signal_connect(check, "toggled", G_CALLBACK(gstreamer_toggle), NULL);

//обработчик воспроизведения

g_signal_connect(btnStop, "clicked", G_CALLBACK(gstreamer_stop), NULL);

g_signal_connect(btnPause, "clicked", G_CALLBACK(gstreamer_pause), NULL);

g_signal_connect(btnPlay, "clicked", G_CALLBACK(gstreamer_play), NULL);

//показать все на форме

gtk_widget_show_all(window);

//вызываем gstreamer

gstreamer();

return 0;

}

//функция реализует выбор файла

static void file_select(GtkFileChooser *selector, gpointer data) {

char *path; //путь к файлу

path = gtk_file_chooser_get_filename(selector);

g_print("file location:%s\n", path);

if (path != NULL) {

//если произошло изменение, выполнение следующих действий:

gstreamer_stop(); //остановка потока

g_object_set(G_OBJECT(filesrc), "location", path, NULL); //изменение файла

gstreamer_stop();

g_object_set(G_OBJECT(adj_progress), "value", 0.0, NULL);

gstreamer_play(); //воспроизведение

}

}

Внешний вид плеера можете посмотреть в п. 3.3

3.2 Реализация звукового потока и привязка к интерфейсу

Сразу приступим к обсуждению файла gsprog.c, в котором реализована программа для звука.

#include <stdio.h> //Подключаем стандартные функции i/o

#include <gtk/gtk.h>//библиотеки интерфейса

#include <gdk/gdk.h>//----||----

#include <gdk/gdkx.h>//----||----

#include <gst/gst.h>//библиотеки gstreamer

#define DEFAULT_FILE "/home/" //путь к нашему файлу

//глобальные переменные для перестраховки

extern GtkAdjustment *adj_progress; //значение ползунка поиска

extern GtkWidget *time_display, *window; //основное окно

GstElement *pipeline; //конвейер

GstElement *filesrc; //чтение файла

GstElement *decoder; //преобразование звука в отсчеты

GstElement *dec1;

GstElement *queueaudio;

GstElement *sink; //воспроизведение звука звуковым драйвером

GstElement *volume; //управление громкостью

GstElement *echo; //звуковой эффект эхо

GstElement *equalizer;//эквалайзер

GstElement *vsink;

GstElement *audioconvert1;

GstElement *audioconvert2;

GstElement *audioconvert3;

gboolean playing = FALSE;

gboolean connected = TRUE;

static gboolean gstreamer_print_position();

int gstreamer() {

GMainLoop *loop; //основной цикл

/*--------------------------------------------

СОЗДАЕМ ЗВУКОВОЙ КОНВЕЙЕР

----------------------------------------------*/

//инициализируем объявленные элементы

//этот кусок практически полностью соответствует методическим //указаниям

pipeline = gst_pipeline_new("my_pipe");

filesrc = gst_element_factory_make("filesrc", "mysrc");

decoder = gst_element_factory_make("mad", "mydec");

sink = gst_element_factory_make("autoaudiosink", "sink");

equalizer = gst_element_factory_make("equalizer-10bands", "my_equal");

decoder = gst_element_factory_make("mad", "mydec4");

echo = gst_element_factory_make("audioecho", "echo");

volume = gst_element_factory_make("volume", NULL);

audioconvert1 = gst_element_factory_make("audioconvert", "conv1");

audioconvert2 = gst_element_factory_make("audioconvert", "conv2");

audioconvert3 = gst_element_factory_make("audioconvert", "conv3");

queueaudio = gst_element_factory_make("queue2", "aqueue");

//установка эффекта эхо

g_object_set(G_OBJECT(echo), "max-delay", 1000000000, NULL);

//передаём элементу filesrc параметр location

g_object_set(G_OBJECT(filesrc), "location", DEFAULT_FILE, NULL);

//запускаем конвейер

gst_bin_add_many(GST_BIN(pipeline), filesrc, decoder, audioconvert3,

queueaudio, audioconvert2, equalizer, audioconvert1, echo, volume, sink, NULL);

//соединяем элементы последовательно

gst_element_link_many(filesrc, decoder, audioconvert3, NULL);

gst_element_link(audioconvert3, queueaudio);

gst_element_link_many(queueaudio, audioconvert2, equalizer, audioconvert1, echo, volume, sink, NULL);

//запускаем основной цикл

loop = g_main_loop_new(NULL, FALSE);

g_print("ok\n");

g_main_loop_run(loop);

gst_element_set_state(pipeline, GST_STATE_NULL);

gst_element_set_state(pipeline, GST_STATE_PLAYING);

return 0;

}

/*--------------------------------------------

ВСПОМОГАТЕЛЬНЫЕ ФУНКЦИИ

----------------------------------------------*/

//функция реализует изменение громкости

void gstreamer_volume(GtkWidget *vol, gpointer data) {

//значение с кнопки громкости

gdouble v = gtk_scale_button_get_value(GTK_SCALE_BUTTON(vol));

//установка громкости

g_object_set(G_OBJECT(volume), "volume", v, NULL);

//вывод громкости в процентах

g_print("vol: %.0lf%\n", v * 100);

}

//функция реализует эффект phaser через echo

void gstreamer_echo() {

guint64 delay = 100000; //задержка в нс

guint64 max_delay = 1; //максимальная задержка

gfloat feedback = 0.0; //обратная связь

gfloat inten = 0.1; //интенсивность

g_print("phaser on\n");

g_object_set(G_OBJECT(echo), "delay", delay, "feedback", feedback, "intensity", inten, "max-delay" , max_delay, NULL );

}

//эта функция работает, когда эффект выключен

void gstreamer_echo_stop() {

//параметры аналогичные предыдущей функции

guint64 delay = 1;

guint64 max_delay = 1;

gfloat feedback = 0.0000;

gfloat inten = 0.0001;

g_print("phaser off\n");

g_object_set(G_OBJECT(echo),"delay", delay, "feedback", feedback, "intensity", inten, "max-delay" , max_delay, NULL );

}

//функция обрабатываетвключение и выключение phaser

void gstreamer_toggle(GtkWidget *check, gpointer data) {

if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(check))) {

//gstreamer_echo_stop();

gstreamer_echo();

}

else

gstreamer_echo_stop();

}

//функция реализует 7 полосный эквалайзер

void gstreamer_equalizer(GtkAdjustment *adj, gpointer num) {

GstObject *band;

int numBand = GPOINTER_TO_INT(num); //номер полосы

gdouble cs = gtk_adjustment_get_value(adj);

//значения с ползунков

//конструкция с параментрами полос

typedef struct {

gfloat freq; //средняя частота

gfloat width; //ширина полосы

gfloat gain; //усиление в dB

} GstEqualizerBandState;

//инициализируем конструкцию, объявляем значения всех 7 полос

GstEqualizerBandState state[] = {

//графу усиления пока оставляем нулевой

{90.0, 70.0, 0.0},

{400.0, 240.0, 0.0},

{970.0, 330.0, 0.0},

{1900.0, 600.0, 0.0},

{3750.0, 1250.0, 0.0},

{7500.0, 2500.0, 0.0},

{15000.0, 5000.0, 0.0}

};

//теперь заполняем графу усиление, передавая параметры с ползунков

state[numBand].gain = cs;

//изменяем звук в соответствии с полученными данными

band = gst_child_proxy_get_child_by_index (GST_CHILD_PROXY (equalizer), numBand);

g_object_set(G_OBJECT(band), "freq", state[numBand].freq, "bandwidth", state [numBand].width, "gain", state[numBand].gain);

g_object_unref (G_OBJECT (band));

}

//функция обрабатывает воспроизведение

int gstreamer_play() {

playing = TRUE;

g_timeout_add(500, (GSourceFunc)gstreamer_print_position, NULL);

gst_element_set_state(pipeline, GST_STATE_PLAYING);

g_print("action: playing\n");

return 0;

}

//функция обрабатывает паузу

int gstreamer_pause() {

playing = FALSE;

gst_element_set_state(pipeline, GST_STATE_PAUSED);

g_print("action: paused\n");

return 0;

}

//функция обрабатывает остановку

int gstreamer_stop() {

playing = FALSE;

g_timeout_add(500, (GSourceFunc)gstreamer_print_position, NULL);

gst_element_set_state(pipeline, GST_STATE_NULL);

g_print("action: stopped\n");

return 0;

}

//функция обрабатывает поиск по треку

static void gstreamer_seek_to_time(GtkAdjustment *ad) {

if(connected) {

gdouble val = gtk_adjustment_get_value(ad);

gst_element_seek (pipeline, 1.0, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH,

GST_SEEK_TYPE_SET, val,

GST_SEEK_TYPE_NONE, GST_CLOCK_TIME_NONE);

}

}

//функция выводит позицию в песне

static gboolean gstreamer_print_position() {

gint64 pos, dur;

GstFormat time = GST_FORMAT_TIME;

gchar progress_text[100];

gst_element_query_position(pipeline, &time, &pos);

gst_element_query_duration(pipeline, &time, &dur);

gint seconds = pos / GST_SECOND;

gint minutes = seconds / 60;

gint seconds_dur = dur / GST_SECOND;

gint minutes_dur = seconds_dur / 60;

sprintf (progress_text, " %d:%02d / %d:%02d ", minutes,

seconds - minutes * 60, minutes_dur, seconds_dur - minutes_dur * 60);

connected = FALSE;

gtk_adjustment_set_upper(adj_progress, dur);

gtk_adjustment_set_value(adj_progress, pos);

connected = TRUE;

gtk_label_set_label(GTK_LABEL(time_display),progress_text);

return playing;

}

Теперь у нас есть все для работающей программы, можно все это собирать вместе и смотреть на работу плеера.

3.2 Итоги

Я приготовил ряд скриншотов нашего плеера, которые демонстрируют его внешний вид и возможности.

Как видите, все кнопки и ползунки, которые мы объявляли в файле playerinterf.c здесь отражены в полном объеме.

Все действия, будь то изменение громкости, включение или выключение эффекта, перемещение ползунков эквалайзера находят отражение в терминале.

Итак, плеер готов, все базовые функции он выполняет, можно теперь заняться реализацией таких полезных вещей, как плейлист, графический спектрометр и многое другое.

Список использованной литературы, источники и инструменты

1) Методические указания по выполнению курсовой работы по дисциплине «Цифровая обработка сигналов в информационных системах»

2) Википедия

Основная работа велась в следующих пакетах:

1) Matlab (Simulink, GUIDE, fdatool)

2) Geany

3) Qt creator

4) XCode

5) MS office

Размещено на Allbest.ru

...

Подобные документы

  • Сравнительная характеристика программ-аналогов. Разработка мультимедиа-проигрывателя по систематизированной обработке музыкальных файлов. Создание удобного пользовательского интерфейса. Поддержка списка воспроизведения, базовые функции управления.

    курсовая работа [1,1 M], добавлен 02.02.2014

  • Основные принципы написания оконных приложений с графическим интерфейсом на языке Java в среде Eclipse. Управление компоновками компонентов: показ диалоговых окон, вывод графической информации. Структура приложения и размещение элементов интерфейса.

    лабораторная работа [1,1 M], добавлен 01.05.2014

  • Характерные особенности мультимедиа-технологий. Особенности разработки мультимедиа-проигрывателя. Анализ удобного пользовательского интерфейса, эквалайзера регулятора громкости. Разработка строки описания треков, программы меню, информации "О программе".

    курсовая работа [1,6 M], добавлен 12.12.2011

  • Основные понятия теории моделирования. Виды и принципы моделирования. Создание и проведение исследований одной из моделей систем массового обслуживания (СМО) – модели D/D/2 в среде SimEvents, являющейся одним из компонентов системы MATLab+SimuLink.

    реферат [1,2 M], добавлен 02.05.2012

  • Разработка визуального интерфейса пользователя, на основе экранных форм среды Delphi и визуальных компонент. Основные типы данных, используемые в программе MD 5 Calc. Однонаправленные хэш-функции. Процесс хэширования MD5, возможности его применения.

    курсовая работа [433,1 K], добавлен 28.08.2012

  • Разработка программы нахождения значения определенного интеграла с помощью метода трапеций. Оценка абсолютной погрешности метода. Использование среды программирования Visual Studio Community 2015 для написания программы. Работа с графическим интерфейсом.

    курсовая работа [573,8 K], добавлен 17.03.2016

  • Проведение исследования стандартов и основ проектирования базы данных. Особенность создания запросов на языке SQL. Функциональные требования, предъявляемые к программе Microsoft SQL Server. Анализ заполнения таблиц. Создание процедур и запросов.

    курсовая работа [2,7 M], добавлен 19.03.2021

  • Разработка компьютерного приложения "Кипящая жидкость" с применением навыков программирования на языке Java. Проектирование алгоритма для решения поставленной задачи, его предметная область. Создание приложения с графическим пользовательским интерфейсом.

    отчет по практике [3,0 M], добавлен 29.10.2015

  • Создание математической и компьютерной модели работы светофора с датчиком на скоростном шоссе с плотным автомобильным графиком. Конечный автомат – абстрактный, без выходного потока с конечным числом возможных состояний. Работа модели в Visual Basic.

    курсовая работа [348,0 K], добавлен 28.06.2011

  • Разработка цифрового измерительного устройства на базе ПЛИС QUARTUS II 9.1SP2 WEB EDITION. Схема подключения МК ATMEGA8515. Схема включения буфера RS-485. Расчёт потребляемой мощности. Разработка программного кода для микроконтроллера ATmega8515.

    курсовая работа [491,5 K], добавлен 03.06.2015

  • Анализ особенностей предметной области. Сбор и анализ необходимой информации. Разработка элементов фирменного стиля музыкального коллектива "Call of Io". Разработка анимации логотипа в Adobe After Effect и последующее монтирование в программе Sony Vegas.

    реферат [3,0 M], добавлен 11.09.2014

  • Программирование скрипта (m-файла) для задания исходных параметров, m-функции для задающего воздействия. Программирование блока "Signal Builder" для возмущающего воздействия. Расчет параметров регулятора. Проектирование Simulink-модели структурной схемы.

    контрольная работа [769,0 K], добавлен 28.05.2013

  • Разработка имитационной модели для изучения движения нелинейного маятника с графическим отображением в ГИС Maple в режиме функционирования системы наблюдений без задержки времени. Гармонические и периодические колебания маятника. Теорема Гюйгенса.

    курсовая работа [1,3 M], добавлен 29.05.2014

  • Процесс создания канального вокодера. Программа на языке Matlab, модель, созданная с помощью системы Matlab Simulink. Осуществление сжатия и восстановления речевого сигнала в реальном времени до уровня не более 4800 бит/с с удовлетворительным качеством.

    курсовая работа [393,7 K], добавлен 12.03.2009

  • Визуальный компонент, используемый для создания главного меню на форме, создание закладки и добавление в список воспроизведения музыкального файла. Определение повторения воспроизведения и отображение списков строк, проигрывание аудио и видео файлов.

    лабораторная работа [128,7 K], добавлен 27.03.2012

  • Аналоги текстовых редакторов с русскоязычным интерфейсом. Разработка и тестирование программного продукта, позволяющего работать с текстом и файлами в редакторе на языке программирования, основанным на русском языке. Алгоритм функционала программы.

    дипломная работа [2,8 M], добавлен 21.07.2013

  • Основные функциональные блоки для построения модели мастерской по ремонту машин. Описание входов и выходов. Экспоненциальное и эрланговское распределение. Вычисление среднего значения входной величины. Структурная модель системы, план экспериментов.

    контрольная работа [412,5 K], добавлен 28.10.2013

  • Принципы редактирования звука в программе Sound Forge. Основные достоинства и недостатки программного продукта. Коючевые элементы окна Sound Forge: управление воспроизведением и масштабом, уровень громкости, перемещение по файлу. Работа с аудиофайлами.

    дипломная работа [3,4 M], добавлен 16.06.2011

  • Структура модели на языке Express. Правила записи супертипов и подтипов. Разработка информационных моделей в рамках концепции CALS. Типы данных в языке Express. Структура портативного зарядного устройства ЗарядON. Изображение сущности на языке Express-G.

    курсовая работа [487,9 K], добавлен 18.01.2013

  • Создание на языке C базы данных "Стадионы города", требования к программе. Осуществление загрузки базы данных в массив и вывод главного меню в основной программе. Алгоритм работы программы в виде блок-схемы. Описание функций программы и ее листинг.

    курсовая работа [183,6 K], добавлен 06.10.2010

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.