Приклад програми для Mac OS

Розробляючи програму для Windows, я використовував текстовий режим для того, щоб не ускладнювати програму B Mac OS аналогічних можливостей не передбачено, тому мені належить більш складна робота

Лістинг 74 Програма macmaincpp

#include &quotaudioh&quot

#include &quotopenh&quot

#include &quotaplayerh&quot

#include &quotmacplayrh&quot

#include &ltfstream&gt

static void InitializeSystem()

static void CheckEvent()

static void DoClick(EventRecord *event)

static void PlayFileSpec(FSSpec *fileSpec)

int main() { InitializeSystem()

cout &lt&lt &quotSelect File : Play. to play a file\n"

while(1) CheckEvent()

return 0

}

Функція InitializeSystem инициализирует Macintosh Toolbox і ряд додаткових утиліт CheckEvent очікує настання певної події і обробляє його DoClick обробляє подія, що виникає при клацанні кнопкою миші І нарешті, функція PlayFileSpec отримує використовувану на компютерах Macintosh специфікацію файлу і безпосередньо відкриває і відтворює файл Зауважимо, що метод МасР1ауеr :: Play () (файл mаср1аусрр) також повинен регулярно перевіряти наступ подій, тому йому також буде переданий покажчик на CheckEvent

Функція підтримки консолі SIOUX (стандартне розширення ввода/ви-

вода для користувача), що забезпечується середовищем розробки Metrowerks CodeWarrior, керуючи текстовим вікном, підтримує введення / висновок в стандартні для C + + гілки cin, cout і cerr Тим не менше, так як я підготував мої власні варіанти для циклу подій і меню, мені необхідно відключити частину налаштувань, що використовуються в SIOUX за замовчуванням

Лістинг 75 Системна підтримка в Macintosh

#include &ltSIOUXh&gt

static void InitializeSystem () {/ / Ініціалізація системних

/ / Компонентів

InitGraf (& qdthePort) / / QuickDraw InitFonts () / / Менеджер шрифтів FlushEvents (everyEvent, 0) / / Відкидаємо всі очікують

/ / Події InitWindows () / / Менеджер вікон InitMenus () / / Менеджер меню TEInit () / / Розширення для роботи

/ / З текстом

InitDialogs (nil) / / Менеджер діалогу InitCursor () / / Курсор

/ / Змінюємо вихідні значення SIOUX SIOUXSettingsstandalone = FALSE

SIOUXSettingssetupmenus = FALSE SIOUXSettingsinitializeTB = FALSE SIOUXSettingsautocloseonquit = TRUE SIOUXSettingscolumns = 80 SIOUXSettingsrows = 12 SIOUXSettingsasktosaveonclose = 0 SIOUXSetTitle(&quot\pPlay Sound&quot)

/ / Налаштування меню

Handle menuBar = GetNewMBar (128) / / Беремо рядок меню

/ / З ресурсів

SetMenuBar(menuBar) DisposeHandle(menuBar)

MenuHandle appleMenu = GetMenuHandle (128) / / Отримуємо

/ / Меню Apple

AppendResMenu (appleMenu, DRVR) / / Додаємо системні

/ / Входи в меню Apple

DrawMenuBar () / / Оновлюємо рядок меню

}

Спочатку функція CheckEvent пропонує обробити нову подію бібліотеці SIOUX Якщо ця бібліотека не може провести обробку, то її виконує безпосередньо CheckEvent Так як я явно працюю тільки з меню, мені необхідно подбати лише про події mouseDown

Лістинг 75 Системна підтримка в Macintosh (продовження)

static void CheckEvent() { EventRecord event Boolean  eventOccured

eventOccured = WaitNextEvent(everyEvent, &ampevent, 10, nil)

if(eventOccured &amp&amp SIOUXHandleOneEvent(&ampevent)) {

switch(eventwhat) {

case mouseDown: DoClick(&ampevent) break

default:                           break

}

}

}

B нашій тестовій програмі використовується тільки одне меню (FiIe), в якому знаходяться всього два рядки: Play .. (воспроізведеніе .) і Quit (вихід) При виборі рядка Play .. викликається стандартна діалогова панель вибору файлу, після чого зазначений вами файл відтворюється Вибір рядка Quit призводить до виходу з програми Клацання мишею по Apple Menu обробляється шляхом звернення до системного викликом OpenDeskAcc

Лістинг 75 Системна підтримка в Macintosh (продовження)

static void DoClick(EventRecord *event) { WindowPtr whichWindow

switch(FindWindow(event-&gtwhere,&ampwhichWindow)) {

case inMenuBar:

long select = MenuSelect(event-&gtwhere)

switch(select &gt&gt 16) {

case 128: / / Меню Apple

{

MenuHandle mh = GetMenuHandle(select &gt&gt 16)

unsigned char itemName[255]

GetMenuItemText(mh, (select &amp 0xFFFF), itemName) OpenDeskAcc(itemName)

HiliteMenu(0)

break

}

case 129: / / Меню File switch (select & 0xFFFF) {

case 1: / / Вибрані File: Play ..

/ / Виклик стандартної діалогової

/ / Панелі вибору файлу

SFTypeList typeList StandardFileReply selectedFile StandardGetFile (

/ / Ні фільтрації

reinterpret_cast&ltRoutineDescriptor *&gt(nil),

-1, / / ​​Всі типи

typeList, / / ​​He використовується

& SelectedFile) / / Повертаємо інформацію

/ / Про вибрану

/ / Блокуємо пункт Play ..

MenuHandle mh = GetMenuHandle(129) DisableItem(mh,1)

HiliteMenu(0) DrawMenuBar()

/ / Відтворюємо файл

PlayFileSpec(&ampselectedFilesfFile)

/ / Деблокіруем пункт Play ..

EnableItem(mh,1) DrawMenuBar() break

case 2: / / Вихід

exit(0)

}

}

break

}

}

Відтворення файлу в Mac OS

Після того як файл вибраний, нам необхідно його відтворити При цьому потрібно враховувати ряд особливостей Mac Toolbox Перша з них полягає в тому,

що структура FSSpec являє собою рядок у форматі мови Паскаль, яка повинна бути перетворена відповідно до форматів, використовуваними в С / С + + Друга особливість у тому, що структура FSSpec може вказувати на файл, розташований в будь-якій доступній системі директорії Перш ніж відкривати цей файл, необхідно встановити як поточної робочої директорії і поточного диска ті директорію і диск, де розташований файл

Лістинг 75 Системна підтримка в Macintosh (продовження)

static void PlayFileSpec(FSSpec *fileSpec) {

char *name = reinterpret_cast&ltchar *&gt(p2cstr(fileSpec-&gtname))

/ / Файл імя

cerr &lt&lt &quotFile: &quot &lt&lt name &lt&lt &quot\n"

short volumeId

OpenWD(fileSpec-&gtvRefNum,fileSpec-&gtparID,NULL, &ampvolumeId) SetVol(NULL,volumeId)

ifstream input(name, ios_base::in | ios_base::binary)

if (inputis_open()) {

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

/ / << ім'я файлу <<

cerr &lt&lt &quotCouldnt open file &quot &lt&lt name &lt&lt &quot\n"

return

}

AudioAbstract *audioRead = OpenFormat(input)

if (audioRead) {

MacPlayer player(audioRead) playerPlay(CheckEvent) delete audioRead

/ / Закінчено відтворення

/ / << ім'я файлу <<.

cerr &lt&lt &quotFinished playing &quot &lt&lt name &lt&lt &quot.\n"

}

cerr &lt&lt &quot\n"

}

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

*

*