Відтворення звуку в Mac OS

Хоча в технічному сенсі Mac OS не є многопотоковой операційною системою, робота зі звуком у ній дуже схожа з роботою зі звуком у Windows Замість використання окремого потоку з процедури служби обробки переривань відбувається звернення до функції зворотного виклику Це накладає ще більш суворі обмеження на те, що можна робити за допомогою функції зворотного виклику: процедури служби обробки переривань повинні виконуватися швидко

Лістинг 71 Програма macplayrh

/*

* Клас програвача для Mac OS

*/

#ifndef MAC_PLAYER_H_INCLUDED

#define MAC_PLAYER_H_INCLUDED

#include &quotaudioh&quot

#include &quotaplayerh&quot

#include &ltResourcesh&gt

#include &ltSoundh&gt

#include &ltMemoryh&gt

#include &ltEventsh&gt

#include &ltStandardFileh&gt

#define doubleBufferSize 0x1000

class MacPlayer : public AbstractPlayer {

private:

friend pascal void NextBlockCallback(SndChannelPtr, SndDoubleBufferPtr)

void NextBlock(SndChannelPtr, SndDoubleBufferPtr)

public:

MacPlayer(AudioAbstract *a):AbstractPlayer(a) {}

~MacPlayer() {}

void Play() { Play(0) }

void Play (void (* serviceFunc) (void)) / / Власне

/ / Відтворення

}

#endif

І знову звертаю вашу увагу на те, що функція зворотного виклику оголошується як friend, це означає, що з неї можна звертатися до прихованого методу NextBlock

Лістинг 72 Програма macplayrcpp

#include &ltResourcesh&gt

#include &ltSoundh&gt

#include &ltMemoryh&gt

#include &ltMenush&gt

#include &ltistream&gt

#include &ltfstream&gt

#include &quotaudioh&quot

#include &quotaplayerh&quot

#include &quotmacplayrh&quot

Виклик підсистеми

Функція NextBlockCallBack викликається Розпорядником Звуку, коли при подвійний буферизації один з буферів стає порожнім Врахуємо, що даний виклик виробляється під час переривання, тому ця процедура повинна виконуватися відносно швидко і не використовувати викликів, які могли б зайняти або звільнити память в динамічно розподіляється системної області (B зокрема, не можна задіяти операції new і delete мови C + +, іноді застосовувані для захоплення або звільнення памяті в системній області)

Функція NextBlockCallBack просто повертає покажчик на обєкт і ініціює метод Вся інша робота виконується методом FromQueue, який акуратно розроблений так, щоб не використовувати ніяких служб операційної системи

B даний момент в цій програмі використовуються тільки 16-бітові відліки При написанні більш витонченою програми вам, можливо, буде потрібно замість 16-бітного використовувати 8-бітове уявлення вибірок B такому випадку врахуйте, що керуюча звуком програма Mac Sound Manager працює в припущенні, що 8-бітові відліки записані в беззнакового форматі (див розділ «Беззнаковая 8-бітна ІКМ» в розділі 10) Нижче я привів два рядки, за допомогою яких байтовий буфер можна перетворити з знакового в беззнаковий формат (або навпаки):

for(long i=0 i&ltcopied i++)

pDest[i]^=0x80

Лістинг 73 Реалізація класу Macplayer

pascal void NextBlockCallback(SndChannelPtr scp, SndDoubleBufferPtr doubleBuffer)

{

MacPlayer *me

= reinterpret_cast&ltMacPlayer *&gt(doubleBuffer-

&gtdbUserInfo[0])

me-&gtNextBlock(scp,doubleBuffer)

}

void MacPlayer::NextBlock(SndChannelPtr, SndDoubleBufferPtr doubleBuffer) {

AudioSample *pDest =

reinterpret_cast&ltSample16 *&gt(doubleBuffer-&gtdbSoundData) long copied = FromQueue(pDest,doubleBufferSize) doubleBuffer-&gtdbNumFrames = copied/Channels()

doubleBuffer-&gtdbFlags = (doubleBuffer-&gtdbFlags) |

dbBufferReady

if (_endOfQueue)

doubleBuffer-&gtdbFlags = (doubleBuffer-&gtdbFlags) |

dbLastBuffer

}

Джерело: Кінтцель Т Керівництво програміста по роботі зі звуком = 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>

*

*