Вибір пристрою

Windows підтримує довільну кількість пристроїв відтворення звуку, і вибір потрібного може виявитися непростим завданням Існують два способи, що дозволяють зясувати можливості цього пристрою Один з них полягає в запиті характеристик пристрою (waveOutGetDevCaps) і застосуванні бітової матриці для підбору найбільш відповідного формату Подібний підхід обмежує нас всього лише трьома можливими значеннями частоти дискретизації, що може виявитися скрутним Крім того, доречно використовувати спеціальну форму виклику waveOutOpen для того, щоб перевірити, чи підтримує яке-небудь з пристроїв бажаний вами формат

Метод SelectDEvice починає роботу з виклику методів MinMaxChannels і MinMaxSamplingRate, що визначають допустимий діапазон параметрів для інших обєктів обробки звуку Після цього слід запит до системи, за допомогою якого визначається, чи може система працювати з оптимальним форматом Якщо приходить негативна відповідь, то у Windows запитується перелік підтримуваних форматів і проводиться пошук стандартного формату, характеристики якого відповідають діапазону допустимих параметрів Якщо один з перерахованих способів спрацює, то стане ясно, які параметри будуть використані, після чого можна викликати методи SetSamplingRateRecursive і SetChanelsRecursive, щоб остаточно задати параметри інших обєктів обробки звуку

Лістинг 63 Реалізація класу WinPalyer (продовження)

/ / Розглянуто базові формати, підтримувані Windows static struct {

DWORD format / / Константа

UINT rate / / Роздільник для цієї константи

UINT channels UINT width

} winFormats[] = {

{WAVE_FORMAT_1S16,

11025, 2,

16},

{WAVE_FORMAT_1S08,

11025, 2,

8},

{WAVE_FORMAT_1M16,

11025, 1,

16},

{WAVE_FORMAT_1M08,

11025, 1,

8},

{WAVE_FORMAT_2S16,

22050, 2,

16},

{WAVE_FORMAT_2S08,

22050, 2,

8},

{WAVE_FORMAT_2M16,

22050, 1,

16},

{WAVE_FORMAT_2M08,

22050, 1,

8},

{WAVE_FORMAT_4S16,

44100, 2,

16},

{WAVE_FORMAT_4S08,

44100, 2,

8},

{WAVE_FORMAT_4M16,

44100, 1,

16},

{WAVE_FORMAT_4M08,

{0,0,0,0}

44100, 1,

8},

}

/ / Узгодимо формат запису і відкриваємо підходяще

/ / Пристрій

int WinPlayer::SelectDevice(void) {

/ / Решта пропозицій за форматами

int channelsMin = 1, channelsMax = 2, channelsPreferred = 0 long rateMin = 8000, rateMax = 44100, ratePreferred = 22050 MinMaxChannels(&ampchannelsMin,&ampchannelsMax,&ampchannelsPreferred) if (channelsMin &gt channelsMax) {

/ / He вдалося узгодити канали

cerr &lt&lt &quotCouldnt negotiate channels\n"

exit (1)

} MinMaxSamplingRate(&amprateMin,&amprateMax,&ampratePreferred) if (rateMin &gt rateMax) {

/ / He вдалося узгодити частоту

/ / Дискретизації

cerr &lt&lt &quotCouldnt negotiate rate\n"

exit(1)

}

/ / Спочатку перевіряємо на точний збіг

static const int NO_MATCH=100000 UINT matchingDevice = NO_MATCH WAVEFORMATEX waveFormat waveFormatwFormatTag = WAVE_FORMAT_PCM waveFormatnChannels = channelsPreferred waveFormatnSamplesPerSec = ratePreferred

waveFormatwBitsPerSample = 8 * sizeof(Sample16)

waveFormatnBlockAlign = waveFormatnChannels

* waveFormatwBitsPerSample / 8

waveFormatnAvgBytesPerSec = waveFormatnBlockAlign

* waveFormatnSamplesPerSec

waveFormatcbSize = 0

MMRESULT err = waveOutOpen(0,WAVE_MAPPER,&ampwaveFormat,

0,0,WAVE_FORMAT_QUERY)

if (err == 0) {

matchingDevice = WAVE_MAPPER

channelsMax = channelsMin = channelsPreferred

rateMax = rateMin = ratePreferred

_sampleWidth = 16

} else {

/ / WinPlay: He вдалося використати

/ / Нестандартний формат, пробуємо стандартні

cerr &lt&lt &quotWinPlay: Custom format failed, "7 cerr &lt&lt &quottrying standard formats\n"

}

/ / Перераховуємо доступні пристрої

UINT numDevs = waveOutGetNumDevs()

if (numDevs == 0) {

/ / Пристроїв виведення звуку не знайдено cerr << "No sound output devices found?! \ N"; exit (1);

}

/ / Перевіряємо всі доступні пристрої

for (UINT i=0 (i&ltnumDevs) &amp&amp (matchingDevice == NO_MATCH)

i++) {

/ / Які формати підтримує цей пристрій

WAVEOUTCAPS waveOutCaps MMRESULT err =

waveOutGetDevCaps(i,&ampwaveOutCaps,sizeof(waveOutCaps))

if (err = MMSYSERR_NOERROR) {

/ / He вдалося отримати інформацію про можливості пристрою

cerr &lt&lt &quotCouldnt get capabilities of device &quot &lt&lt i &lt&lt

&quot\n"

continue

}

/ / Перевіряємо всі стандартні формати

for(UINT j=0 winFormats[j]format = 0 j++) {

if ((winFormats[j]format &amp waveOutCapsdwFormats)

/ / Підтримує

&amp&amp(rateMin &lt= winFormats[j]rate)

/ / Частота підходить

&amp&amp(rateMax &gt= winFormats[j]rate)

&amp&amp(channelsMin &lt= winFormats[j]channels)

/ / Кількість каналів підходить

&amp&amp(channelsMax &gt= winFormats[j]channels)) {

/ / Встановлюємо мої параметри

matchingDevice = i

rateMin = rateMax = ratePreferred =

winFormats[j]rate

channelsPreferred = winFormats[j]channels

channelsMin = channelsMax = channelsPreferred

_sampleWidth = winFormats[j]width

/ / Відповідно встановлюємо структуру WAVEFORMATEX waveFormatwFormatTag = WAVE_FORMAT_PCM waveFormatnChannels = winFormats [j] channels waveFormatnSamplesPerSec = winFormats [j] rate waveFormatwBitsPerSample = winFormats[j]width waveFormatnBlockAlign = waveFormatwBitsPerSample / 8

* waveFormatnChannels

waveFormatnAvgBytesPerSec = waveFormatnBlockAlign

* waveFormatnSamplesPerSec

waveFormatcbSize = 0

}

}

}

if (matchingDevice == NO_MATCH) {

/ / Даний формат не підтримується

/ / Далі йдуть параметри формату

cerr &lt&lt &quotCant handle this sound format\n"

cerr &lt&lt &quotRate: &quot &lt&lt rateMin &lt&lt &quot-&quot &lt&lt rateMax &lt&lt &quot\n"

cerr &lt&lt &quotChannels: &quot &lt&lt channelsMin &lt&lt &quot-&quot &lt&lt channelsMax

&lt&lt &quot\n"

return 1

}

/ / Якщо вдалося знайти збігаються параметри, задаємо все

SetChannelsRecursive(channelsPreferred) SetSamplingRateRecursive(ratePreferred)

/ / Відкриваємо відповідне пристрій

MMRESULT err2 = waveOutOpen(&amp_device,matchingDevice,

&ampwaveFormat, reinterpret_cast&ltDWORD&gt(WaveOutCallback), reinterpret_cast&ltDWORD&gt(this),CALLBACK_FUNCTION)

if (err2) {

/ / He вдалося відкрити пристрій відтворення WAVE

cerr &lt&lt &quotCouldnt open WAVE output device\n"

exit (1)

}

return 0

}

Джерело: Кінтцель Т Керівництво програміста по роботі зі звуком = A Programmers Guide to Sound: Пер з англ М: ДМК Пресс, 2000 432 с, іл (Серія «Для програмістів»)

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*