![]() |
TX Library Help – Version: 00173a, Revision: 173
|
Классы | |
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.
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(); // Ожидаем конца проигрывания
typedef bool MonitorProc_t(HWAVEIN waveIn, txWaveData_t &data, void *userData) |
Тип функции-монитора для функции txWaveIn().
waveIn | Дескриптор устройства записи |
data | Ссылка на буфер, где находятся записанные данные |
userData | Указатель на пользовательские данные monitorData , переданные из функции txWaveIn() |
true
. Если надо закончить запись - false
.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
, то при исчерпании данных вектора они будут игнорироваться.// Звук 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);
HWAVEOUT txWaveOut | ( | const txWaveData_t & | data, |
int | loops = 1 |
||
) |
Проигрывает подготовленный или загруженный буфер через звуковую карту.
data | Подготовленные данные для воспроизведения (например, загруженные из WAV-файла) |
loops | Сколько раз повторять звук |
// Музыка, загруженная из файла 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); }
bool MonitorProc | ( | HWAVEIN | waveIn, |
txWaveData_t & | data, | ||
void * | userData | ||
) |
Функция-монитор, регулярно вызывающаяся при записи звука.
waveIn | Дескриптор устройства записи |
data | Ссылка на буфер, где находятся записанные данные |
userData | Указатель на пользовательские данные monitorData , переданные из функции txWaveIn() |
true
. Если надо закончить запись - false
.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 , мсек |
frameTime
не указан или равен 0, он устанавливается равным 100 миллисекунд.txWaveData_t wav = txWaveIn (20000); // Записываем звук 20 секунд txWaveOut (wav); // Проигрываем звук txWaveOut(); // Ожидаем конца проигрывания // Пример с функцией-монитором см. в файле TXWaveExample.cpp.
unsigned long txWaveGetPosition | ( | void * | wave | ) |
Возвращает текущую позицию воспроизведения или записи.
wave | Устройство воспроизведения или записи |
HWAVEOUT waveOut = txWaveOut (time, 440); assert (waveOut); // Запускаем звук while (txWaveGetPosition (waveOut) < size) // Проигран ли звук до конца? { if (_kbhit())) txWaveOut (0); // Закончить звук, если нажали клавишу printf ("."); Sleep (100); }
txWaveData_t txWaveLoadWav | ( | const char | filename[] | ) |
Загружает звуковые данные из WAV-файла.
filename | Имя файла в формате WAV |
std::vector <txWaveData_t>,
с загруженными данными
.size().txWaveData_t purr = txWaveLoadWav ("Purr.wav"); txWaveOut (purr); // Проигрываем звук txWaveOut(); // Ожидаем конца проигрывания
bool txWaveSaveWav | ( | const txWaveData_t & | data, |
const char | filename[] | ||
) |
Сохраняет звуковые данные в WAV-файле.
data | Данные для записи (например, записанные с помощью txWaveIn(), или вычисленные по формуле) |
filename | Имя файла с расширением WAV |
txWaveData_t wav = txWaveIn (20000); // Записываем звук txWaveSaveWav (wav, "Recording.wav"); // Сохраняем звук в файл
const double txWaveSampleRate = 44.100 |
Скорость аудиопотока для TXWave в семплах на 1 миллисекунду.
const WAVEFORMATEX txWaveFormat |
Формат аудиоданных для TXWave.
Амплитудная модуляция без сжатия, 2 канала, 16 бит на канал, 44.100 кГц (txWaveSampleRate).
const double txWaveVolMax |
Максимальная громкость в txWaveSample_t, согласно формату txWaveFormat.