Мультимедиа. Работа со звуком
Особенности Juce 2
Во 2-й версии библиотеки в метод setSource класса AudioTransportSource был добавлен ещё один параметр — указатель на объект класса TimeSliceThread:
void AudioTransportSource::setSource(PositionableAudioSource* newSource, int readAheadBufferSize = 0, TimeSliceThread* readAheadThread = nullptr, double sourceSampleRateToCorrectFor = 0.0, int maxNumChannels = 2)
Класс TimeSliceThread представляет собой нить, сохраняющую список клиентов и вызывающую их по очереди для выполнения какой-то короткой задачи.
В версии нашего проигрывателя, ориентированной на Juce 2.0, мы должны объявить в закрытой части объявления класса компонента содержимого переменную TimeSliceThread PlayThread.
Конструктор класса TimeSliceThread в качестве параметра принимает строку ( пример 19.18).
TCentralComponent::TCentralComponent() : Component("Central Component"), pNameLabel(0), pChooseButton(0), PlayThread("PlayThread") { pNameLabel = new Label(L"Name Label", tr("Выберите файл...")); pNameLabel->setFont(Font(15.0000f, Font::bold)); pNameLabel->setJustificationType(Justification::centred); pNameLabel->setEditable(false, false, false); pNameLabel->setColour(Label::textColourId, Colours::black); pNameLabel->setColour(Label::backgroundColourId, Colours::azure); pNameLabel->setColour(Label::outlineColourId, Colours::black); addAndMakeVisible(pNameLabel); // ... PlayThread.startThread(3); }Листинг 19.18. Реализация части конструктора класса класса компонента содержимого TCentralComponent (файл TCentralComponent.cpp)
Нить запускается в конструкторе класса, а при завершении работы программы должна быть остановлена ( пример 19.19).
TCentralComponent::~TCentralComponent() { PlayThread.signalThreadShouldExit(); PlayThread.waitForThreadToExit(100); pAudioDeviceManager->closeAudioDevice(); TransportSource.setSource(0); AudioPlayer.setSource(0); pAudioDeviceManager->removeAudioCallback(& AudioPlayer); if(pAudioDeviceManager) delete pAudioDeviceManager; if(pCurrentAudioFileSource) delete pCurrentAudioFileSource; if(pFileNameDialog) delete pFileNameDialog; deleteAllChildren(); }Листинг 19.19. Реализация деструктора класса класса компонента содержимого TCentralComponent (файл TCentralComponent.cpp)
Если не считать этого параметра, то передача в AudioTransportSource нового источника аудиоданных осуществляется обычно: TransportSource.setSource(pCurrentAudioFileSource, 32768, & PlayThread, pAudioFormatReader->sampleRate);
Отметим также, что для корректной сборки программ с поддержкой аудио в Juce, помимо собственно аудио-модулей, в проекте должен быть включён модуль juce_gui_extra.
Краткие итоги
В этой лекции вы познакомились со взаимодействием классов, необходимых для воспроизведения основных форматов музыкальных файлов (AIFF, FLAC, OGG VORBIS, WAV), а также для файлов MIDI.
Основным классом, отвечающим за воспроизведение аудио-файлов в Juce является AudioTransportSource.
Упражнение
Напишите программу, включающую окно с несколькими кнопками. При нажатии на кнопку происходит воспроизведение ассоциированного с ней аудио-файла, находящегося в каталоге программы.
Дополнительные материалы
Архив с исходными текстами примеров Вы можете скачать здесь.