TX Library Help – Version: 00173a, Revision: 173
 ALL  Windows graphics in a sandbox

[TXWave] Работа со звуком

Классы

union  txWaveSample_t
 Тип данных, использующийся для внутреннего представления звуков согласно формату txWaveFormat. Подробнее...

Определения типов

typedef std::vector
< txWaveSample_t
txWaveData_t
 Тип, использующийся для буферов данных.
typedef bool MonitorProc_t (HWAVEIN waveIn, txWaveData_t &data, void *userData)
 Тип функции-монитора для функции txWaveIn().

Функции

HWAVEOUT txWaveOut (int timeMs=-INT_MAX, double freqL=0, double volL=50, double freqR=-1, double volR=-1, int loops=1, const txWaveData_t &data=txWaveData_t())
 Проигрывает звук через звуковую карту.
HWAVEOUT txWaveOut (const txWaveData_t &data, int loops=1)
 Проигрывает подготовленный или загруженный буфер через звуковую карту.
bool MonitorProc (HWAVEIN waveIn, txWaveData_t &data, void *userData)
 Функция-монитор, регулярно вызывающаяся при записи звука.
txWaveData_t txWaveIn (int timeMs, MonitorProc_t *monitorProc=NULL, void *monitorData=NULL, unsigned frameTime=0)
 Записывает звук со звуковой карты.
unsigned long txWaveGetPosition (void *wave)
 Возвращает текущую позицию воспроизведения или записи.
txWaveData_t txWaveLoadWav (const char filename[])
 Загружает звуковые данные из WAV-файла.
bool txWaveSaveWav (const txWaveData_t &data, const char filename[])
 Сохраняет звуковые данные в WAV-файле.

Переменные

const double txWaveSampleRate = 44.100
 Скорость аудиопотока для TXWave в семплах на 1 миллисекунду.
const WAVEFORMATEX txWaveFormat
 Формат аудиоданных для TXWave.
const double txWaveVolMax
 Максимальная громкость в txWaveSample_t, согласно формату txWaveFormat.

Типы

typedef std::vector<txWaveSample_t> txWaveData_t

Тип, использующийся для буферов данных.

Это std::vector <txWaveSample_t>.

txWaveSample_t эквивалентен массиву из двух элементов типа short, соответствующим левому и правому каналу.

Максимальная громкость в канале задается константой txWaveVolMax.

См. также:
txWaveData_t, txWaveSampleRate, txWaveVolMax, txWaveFormat, txWaveLoadWav(), txWaveOut(), txWaveIn()
Примеры использования:
          int time = 2000;
          txWaveData_t wav (ROUND (time * txWaveSampleRate));

          printf ("Generating the waveform ~880 Hz...\n");

          for (unsigned i = 0; i < wav.size(); i++)
              wav[i][0] = wav[i][1] = (short) (sin (i*0.125) * txWaveVolMax);  // * 2*M_PI/44100 * 880

          printf ("Playing %d sec...\n\n", time/1000);

          txWaveOut (buf);  // Проигрываем звук
          txWaveOut();      // Ожидаем конца проигрывания

См. определение в файле TXWave.h строка 165

typedef bool MonitorProc_t(HWAVEIN waveIn, txWaveData_t &data, void *userData)

Тип функции-монитора для функции txWaveIn().

Аргументы:
waveInДескриптор устройства записи
dataСсылка на буфер, где находятся записанные данные
userDataУказатель на пользовательские данные monitorData, переданные из функции txWaveIn()
Возвращает:
Если надо продолжать запись, то true. Если надо закончить запись - false.
См. также:
txWaveIn(), MonitorProc()
Примеры использования:
См. MonitorProc()

См. определение в файле TXWave.h строка 300


Функции

HWAVEOUT txWaveOut ( int  timeMs = -INT_MAX,
double  freqL = 0,
double  volL = 50,
double  freqR = -1,
double  volR = -1,
int  loops = 1,
const txWaveData_t data = txWaveData_t() 
)

Проигрывает звук через звуковую карту.

Аргументы:
timeMsВремя звучания в миллисекундах
freqLЧастота звука в левом канале в Герцах
volLГромкость звука в левом канале в процентах от максимума
freqRЧастота звука в правом канале в Герцах
volRГромкость звука в правом канале в процентах от максимума
loopsСколько раз повторять звук
dataПодготовленные данные для воспроизведения (например, загруженные из WAV-файла)
Возвращает:
Дескриптор аудиоустройства воспроизведения
Замечание:
Если во время вызова еще воспроизводится предыдущий звук, то функция подождет его завершения, а затем запустит воспроизведение нового.
Параметр time:
  • Если время звучания time положительно, то функция начинает воспроизведение и возвращается, а звук продолжает звучать в фоновом режиме.
  • Если отрицательно, то функция будет ожидать завершения воспроизведения звуков в течение |time| миллисекунд.
  • Вызов функции без параметров будет ожидать окончания воспроизведения всех звуков.
  • Если time равно нулю, то воспроизведение сразу прекращается.
Гармонические параметры - частоты (freqL, freqR) и громкости (volL, volR) каналов:
  • Если частота левого канала freqL не указана или равна 0, то будут учитываться только данные из буфера левого канала.
  • Если громкость левого канала volL не указана, то она полагается равной 50%.
  • Если частота правого канала freqR не указана, то она полагается равной частоте левого канала.
  • Если громкость правого канала volR не указана, то она полагается равной громкости левого канала.
  • Частоты можно сочетать с подготовленными данными буфера data.
  • Если гармонических данных нет как в левом канале (freqL == 0 или volL == 0), так и в правом (freqR == 0 или volR == 0), то фактическая длительность звучания определяется не параметром time, а размером буфера data.
Подготовленные данные data:
  • Данные в векторе data напрямую влияют на мембраны колонок или наушников.
  • На данные в этом векторе не влияют параметры громкости volL и volR.
  • Если вектор data не указан, то он не учитывается.
  • Подготовленные данные data можно сочетать с частотами freqL и freqR.
  • Вектор data должен быть размером не менее, чем time * txWaveSampleRate.
  • Если размера вектора не хватает для времени воспроизведения в течении времени time, то при исчерпании данных вектора они будут игнорироваться.
См. также:
txWaveIn(), txWaveGetPosition(), txWaveLoadWav(), txWaveSampleRate, txWaveVolMax, txWaveFormat, txWaveData_t, txWaveSample_t
Примеры использования:
          // Звук 1 сек, 880 Гц, моно, 50% громкости

          txWaveOut (1000, 880);  // Запустить проигрывание, далее оно идет в фоновом режиме

          // Сирена 880 +/- 88 Гц, моно, 50% громкости

          for (double t = -0.1; !_kbhit(); t += 0.1)
              txWaveOut (100, 880 + 88 * cos (t));

          // Сирена 880 +/- 88 Гц, стерео

          for (double t = -0.1; !_kbhit(); t += 0.1)
              txWaveOut (100, 880 + 88 * cos (t), 100, 880 + 88 * sin (t), 100);

См. определение в файле TXWave.h строка 581

HWAVEOUT txWaveOut ( const txWaveData_t data,
int  loops = 1 
)

Проигрывает подготовленный или загруженный буфер через звуковую карту.

Аргументы:
dataПодготовленные данные для воспроизведения (например, загруженные из WAV-файла)
loopsСколько раз повторять звук
Возвращает:
Дескриптор аудиоустройства воспроизведения
См. также:
txWaveIn(), txWaveGetPosition(), txWaveLoadWav(), txWaveSampleRate, txWaveVolMax, txWaveFormat, txWaveData_t, txWaveSample_t
Примеры использования:
          // Музыка, загруженная из файла

          txWaveOut (txWaveLoadWav ("Purr.wav"));  // Начинаем проигрываем звук, он воспроизводится асинхронно
          ...
          txSleep();                               // Ожидаем конца проигрывания

          // Музыка, формируемая в буфере
          // See http://countercomplex.blogspot.ru/2011/10/algorithmic-symphonies-from-one-line-of.html

          int time = 90000;
          txWaveData_t buf (ROUND (time * txWaveSampleRate));
          unsigned size = (unsigned) buf.size();

          for (unsigned i = 0; i < size; i++)
              {
              int t   = i/5;
              int val = (((t >> 7) | t | (t >> 6)) * 10 + 4 * ((t & (t >> 13)) | (t >> 6))) & 0xFF;

              buf[i][0] = buf[i][1] = (short) ((val/127.0 - 1) / (1 + pow (15, 17.0*i/size - 15)) * txWaveVolMax);
              }

          HWAVEOUT waveOut = txWaveOut (buf); assert (waveOut);  // Запускаем звук

          while (txWaveGetPosition (waveOut) < size)  // Проигран ли звук до конца?
              {
              if (_kbhit())) txWaveOut (0);           // Закончить звук, если нажали клавишу
              Sleep (100);
              }

См. определение в файле TXWave.h строка 749

bool MonitorProc ( HWAVEIN  waveIn,
txWaveData_t data,
void *  userData 
)

Функция-монитор, регулярно вызывающаяся при записи звука.

Аргументы:
waveInДескриптор устройства записи
dataСсылка на буфер, где находятся записанные данные
userDataУказатель на пользовательские данные monitorData, переданные из функции txWaveIn()
Возвращает:
Если надо продолжать запись, то true. Если надо закончить запись - false.
См. также:
txWaveIn(), txWaveGetPosition(), txWaveVolMax, txWaveFormat, txWaveData_t, txWaveSample_t
Примеры использования:
          bool MonitorProc (HWAVEIN, txWaveData_t& data, void*)
              {
              static const char line1[] = "-------------------------";
              static const char line2[] = "|||||||||||||||||||||||||";
              static const int  lineSz  = sizeof (line1) - 1;

              unsigned pos  = (unsigned) data.size();
              unsigned size = (unsigned) data.capacity();
              unsigned done = (unsigned) (100 * pos/size);

              double avr = 0;
              if (pos >= 100) for (unsigned i = pos - 100; i < pos; i++) avr += (abs (data[i][0]) + abs (data[i][1])) / txWaveVolMax;
              int vol = (avr <= 100)? (int) avr : 100;

              printf ("Done %6u/%6u samples   [%.*s|%.*s] %3u%%  [%.*s%.*s%s %3d%%  \r",
                       pos, size,
                       (int) (lineSz*done/100), line1, (int) (lineSz - lineSz*done/100), line1,                         done,
                       (int) (lineSz*vol /100), line2, (int) (lineSz - lineSz*vol /100), line1, (vol < 100? "]" : "X"), vol);

              return (_kbhit()? (_getch(), false) : true);
              }

См. определение в файле TXWaveExample.cpp строка 245

txWaveData_t txWaveIn ( int  timeMs,
MonitorProc_t monitorProc = NULL,
void *  monitorData = NULL,
unsigned  frameTime = 0 
)

Записывает звук со звуковой карты.

Аргументы:
timeMsВремя записи в миллисекундах
monitorProcФункция, которая вызывается после каждого записанного кадра длиной frameTime мсек
monitorDataУказатель на пользовательские данные, которые будут переданы функции monitorProc
frameTimeИнтервал времени записи, через который будет вызываться функция monitorProc, мсек
Возвращает:
Количество записанных данных
Замечания:
  • Если функция MonitorProc не указана, то в процессе записи она не будет вызываться.
  • Если интервал времени frameTime не указан или равен 0, он устанавливается равным 100 миллисекунд.
См. также:
monitorProc(), txWaveOut(), txWaveGetPosition(), txWaveSaveWav(), txWaveSampleRate, txWaveVolMax, txWaveFormat, txWaveData_t, txWaveSample_t
Примеры использования:
          txWaveData_t wav = txWaveIn (20000);  // Записываем звук 20 секунд

          txWaveOut (wav);  // Проигрываем звук
          txWaveOut();      // Ожидаем конца проигрывания

          // Пример с функцией-монитором см. в файле TXWaveExample.cpp.
unsigned long txWaveGetPosition ( void *  wave)

Возвращает текущую позицию воспроизведения или записи.

Аргументы:
waveУстройство воспроизведения или записи
Возвращает:
Количество уже воспроизведенных или уже записанных элементов буферов
См. также:
txWaveOut(), txWaveIn(), txWaveSampleRate, txWaveFormat
Примеры использования:
          HWAVEOUT waveOut = txWaveOut (time, 440); assert (waveOut);  // Запускаем звук

          while (txWaveGetPosition (waveOut) < size)  // Проигран ли звук до конца?
              {
              if (_kbhit())) txWaveOut (0);           // Закончить звук, если нажали клавишу

              printf (".");
              Sleep (100);
              }

См. определение в файле TXWave.h строка 854

txWaveData_t txWaveLoadWav ( const char  filename[])

Загружает звуковые данные из WAV-файла.

Аргументы:
filenameИмя файла в формате WAV
Возвращает:
txWaveData_t, т.е. std::vector <txWaveData_t>, с загруженными данными
Заметки:
Не все форматы файлов поддерживаются. Файл должен быть в формате WAV, Microsoft PCM, Стерео (2 канала), скорость семплирования 44.100 кГц (txWaveSampleRate), 16 бит на канал. Если файл другого формата, его надо преобразовать в нужный формат. Например, программой "CoolEdit 2000" или аналогичной.

Кроме того, если при загрузке файла не хватило памяти, он не будет загружен. Проверьте размер вектора, возвращенного функцией, вызвав для него функцию-член .size().
См. также:
txWaveOut(), txWaveIn(), txWaveSaveWav(), txWaveSampleRate, txWaveVolMax, txWaveFormat
Примеры использования:
          txWaveData_t purr = txWaveLoadWav ("Purr.wav");

          txWaveOut (purr);  // Проигрываем звук
          txWaveOut();       // Ожидаем конца проигрывания

См. определение в файле TXWave.h строка 903

bool txWaveSaveWav ( const txWaveData_t data,
const char  filename[] 
)

Сохраняет звуковые данные в WAV-файле.

Аргументы:
dataДанные для записи (например, записанные с помощью txWaveIn(), или вычисленные по формуле)
filenameИмя файла с расширением WAV
Возвращает:
true, если файл открылся на запись, иначе false
См. также:
txWaveIn(), txWaveSampleRate, txWaveVolMax, txWaveFormat
Примеры использования:
          txWaveData_t wav = txWaveIn (20000);   // Записываем звук
          txWaveSaveWav (wav, "Recording.wav");  // Сохраняем звук в файл

См. определение в файле TXWave.h строка 975


Переменные

const double txWaveSampleRate = 44.100

Скорость аудиопотока для TXWave в семплах на 1 миллисекунду.

См. также:
txWaveFormat, txWaveOut(), txWaveIn(), txWaveGetPosition(), txWaveLoadWav(), txWaveFormat, txWaveSample_t

См. определение в файле TXWave.h строка 78

const WAVEFORMATEX txWaveFormat

Формат аудиоданных для TXWave.

Амплитудная модуляция без сжатия, 2 канала, 16 бит на канал, 44.100 кГц (txWaveSampleRate).

См. также:
txWaveOut(), txWaveIn(), txWaveGetPosition(), txWaveLoadWav(), txWaveSampleRate, txWaveSample_t, txWaveData_t

См. определение в файле TXWave.h строка 91

const double txWaveVolMax

Максимальная громкость в txWaveSample_t, согласно формату txWaveFormat.

См. также:
txWaveSampleRate, txWaveFormat, txWaveData_t, txWaveLoadWav(), txWaveOut(), txWaveIn()

См. определение в файле TXWave.h строка 102