Главная » Программирование звука » Класс AudioAbstract

0

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

Листинг 4.3. Программа audio.h

#ifndef AUDIO_H_INCLUDED

#define AUDIO_H_INCLUDED

#include <typeinfo>

#include <iostream>

#include <cstddef>

// Последующая  строка  программы необходима только  в  том   случае,

// если  используемый вами компилятор строго  следует  ANSI-

// стандарту  языка C++ (что практически  не   встречается).

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

//не   реализована вообще.

// Если   ваш  компилятор  выдаст  сообщение об   ошибке в  этой  строке,

// просто пометьте ее  как  комментарий и  попробуйте

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

using namespace std;

class AudioAbstract {

B  первой  фазе  этого  согласования  сообщение  NegotiateSamplingRate рекурсивно  продвигается  налево.  B  конце  концов,  оно  достигает  крайнего  слева объекта, который управляет фактическим согласованием.

Листинг 4.7. Интерфейс согласования частоты дискретизации класса AudioAbstract (продолжение)

public:

virtual void NegotiateSamplingRate(void);

Листинг 4.8. Согласование частоты дискретизации класса

AudioAbstract

void AudioAbstract::NegotiateSamplingRate (void) {

if (Next())                          // Объект крайний  слева?

Next()->NegotiateSamplingRate(); // Нет, продолжаем  работу.

else {                               // Да.

long min = 8000, max = 44100, preferred = 44100; MinMaxSamplingRate(&min,&max,&preferred); // Получаем

// предпочтительные значения.

if (min > max) {       // Проверка  на   недопустимый  ответ.

// He удается согласовать

// частоту дискретизации.

cerr << "Couldn’t negotiate sampling rate.\n";

exit(1);

SetSamplingRateRecursive(preferred) ; // Устанавливаем

// во   всех  объектах

// выбранные  значения.

}

}

Процесс  согласования  заключается  в  выборе  диапазона  значений,  приемлемого  для  всех  объектов.  B  объекте  также  можно  указать  preferred (предпочтительное)  значение   этого  параметра,  не   выходящее   за   данный  диапазон.  Если в  каком-либо  объекте  необходимо  строго  задать  определенную  частоту,  следует указать одинаковые значения для минимального и максимального пределов.

Bo  многих  классах  может  понадобиться  произвести  подмену  метода  MinMaxSamplingRate для  того,  чтобы  вычислить  их  параметры.  После  выполнения  перегруженного  метода  для  продолжения  процесса  согласования  вызывается  метод AudioAbstract::MinMaxSamplingRate.    Например,    в    объекте,    производящем чтение  данных  из  файла,  после  чтения  заголовка  понадобится  сделать  паузу  до тех пор, пока объект не получит сообщение с запросом информации из файла.

Как  только  будет  выбрано  предпочтительное  значение,  метод  SetSamplingRateRecursive задаст это значение во всех объектах.

Листинг 4.7. Интерфейс согласования частоты дискретизации класса AudioAbstract (продолжение)

public:

virtual void MinMaxSamplingRate(long *min, long *max, long

*prefer);

virtual void SetSamplingRateRecursive(long s);

Листинг 4.8. Согласование частоты дискретизации класса AudioAbstract

(продолжение)

void AudioAbstract::MinMaxSamplingRate(long *min, long *max, long *preferred) {

if (Previous()) Previous()-

>MinMaxSamplingRate(min,max,preferred);

if (_samplingRate) *preferred = _samplingRate;

if (*preferred < *min) *preferred = *min;

if (*preferred > *max) *preferred = *max;

}

void AudioAbstract::SetSamplingRateRecursive(long s) {

if (Previous())                // Сначала устанавливаем

// для того, что справа.

Previous()->SetSamplingRateRecursive(s); SamplingRate(s);               // Устанавливаем.

_samplingRateFrozen = true;    // Да, частота согласована.

}

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

Согласование   количества   каналов   производится   аналогичным   образом.   Возможно,  некоторые  приложения  могли  бы  получить  преимущество,  используя  различные  форматы  AudioSample (выборка),  такие  как  8-битный  и  16-битный.  Вы легко   смогли   бы   аналогичным   образом   провести   дополнительное   согласование величины моментального значения.

Листинг 4.9. Интерфейс согласования количества каналов класса AudioAbstract

private:

long _channels;

bool _channelsFrozen;

public:

virtual int Channels(void) {

if (!_channelsFrozen) NegotiateChannels();

return _channels;

};

virtual void Channels(int ch) {

if (_channelsFrozen) {

// He могу изменить  число  каналов.

cerr << "Can’t change number of channels.\n";

exit(1) ;

}

_channels = ch;

};

virtual void NegotiateChannels(void);

virtual void MinMaxChannels(int *min, int *max, int

*preferred);

virtual void SetChannelsRecursive(int s);

Листинг 4.10. Согласование количества каналов класса AudioAbstract

void AudioAbstract::NegotiateChannels(void) {

if (Next())

Next()->NegotiateChannels();

else {

int min=1, max=2, preferred=1;   // Значения, используемые

// по  умолчанию.

MinMaxChannels(&min,&max,&preferred);

if (min > max) {

// He удалось согласовать

// частоту дискретизации.

cerr << "Couldn’t negotiate sampling rate.\n";

exit(1);

} SetChannelsRecursive(preferred);

}

}

void AudioAbstract::MinMaxChannels(int *min, int *max, int

*preferred) {

if (Previous()) Previous()->MinMaxChannels(min,max,preferred);

if (_channels) *preferred = _channels;

if (*preferred < *min) *preferred = *min;

if (*preferred > *max) *preferred = *max;

}

void AudioAbstract::SetChannelsRecursive(int ch) {

if (Previous()) Previous()->SetChannelsRecursive(ch); Channels(ch);

_channelsFrozen = true;

}

Источник: Кинтцель Т.  Руководство программиста по работе со звуком = A Programmer’s Guide to Sound: Пер. с англ. М.: ДМК Пресс, 2000. 432 с, ил. (Серия «Для программистов»).

По теме:

  • Комментарии