Опубликован: 13.07.2012 | Доступ: свободный | Студентов: 460 / 8 | Оценка: 5.00 / 5.00 | Длительность: 18:06:00
Специальности: Программист
Лекция 19:

Мультимедиа. Работа со звуком

< Лекция 18 || Лекция 19: 12345 || Лекция 20 >

Особенности 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.

Упражнение

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

Дополнительные материалы

Архив с исходными текстами примеров Вы можете скачать здесь.

< Лекция 18 || Лекция 19: 12345 || Лекция 20 >