
waveOutOpen, ומסבירים מה הערוץ הזה מייצג ולמה צריך אותו לפני כל ניגון. בדרך מגדירים את פורמט הצליל ומטפלים בשגיאות בעזרת חריגה משלנו.waveOutGetNumDevs מחזירה כמה התקני ניגון יש במחשב, ו-waveOutGetDevCaps ממלאת את היכולות של כל התקן. בהרצאה נמצא התקן אחד, ולכן אפשר לפנות אליו עם מזהה 0. בהמשך המשתמש יבחר את המזהה בעצמו.waveOutOpen כותבת לתוך משתנה שמעבירים לה את הכתובת שלו, ומחזירה קוד תוצאה. הערך שנשמר הוא ה-handle שמייצג את ערוץ התקשורת מול ההתקן, בדומה למזהה של קובץ שמקבלים מ-fopen או למזהה של חלון. אפשר לפתוח כמה ערוצים במקביל ולנגן דברים שונים בכל אחד מהם.WAVEFORMATEX: ניגון מסוג PCM, ערוץ אחד (מונו), 8,000 דגימות בשנייה ו-8 ביטים לדגימה. כל דגימה היא בית אחד, בין 0 ל-255, ולכן הקצב הזה נותן כ-64 קילו-ביט בשנייה, איכות דומה לטלפון.AudioException. המחלקה שומרת את טקסט השגיאה ומחזירה אותו דרך get_message, וה-catch תופס רק את החריגה הזו.cout, ואפשר להציב using namespace std בראש הקובץ כדי לא לכתוב std:: בכל שורה. הגרסה הרחבה של המחרוזות (W) נשארת לעת עתה כברירת מחדל.waveOutOpen נקראת עם מזהה 0, מצביע למבנה הפורמט, וללא callback (הערך 0), כלומר התוכנית לא תקבל הודעה כשהניגון מסתיים.nChannels = 1, nSamplesPerSec = 8000, nAvgBytesPerSec = 8000, nBlockAlign = 1, wBitsPerSample = 8, cbSize = 0.-1 מבקש מהמערכת לבחור התקן בעצמה, לפי מה שמוסבר בהרצאה.catch כללי שתופס כל חריגה מסתיר בעיות אחרות. עדיף לתפוס את החריגה הספציפית.new צריכה להיתפס כמצביע לחריגה, אחרת ה-catch לא מזהה אותה..ncb, קבצי .pdb ותיקיות Debug שמגיעות לעשרות מגה-בייט, בעוד שהקוד עצמו קטן מאוד. לפני שליחת הפרויקט מנקים אותם.הטקסט המלא של הדקות הראשונות בהרצאה «Audio - waveOutOpen» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
טוב בואו נמשיך בעצם אני רוצה את זה כן פתוח את זה פתוח יפה טוב אנחנו ממשיכים עם ניגון של אודיו נפתח את זה אפילו לא צריך אני פשוט פותח את הוויז'ואל סטודיו והוא זוכר לי יפה אז יש לנו את ה-Device Capabilities את ה-Wave Out Capabilities קיבלנו ואז בעצם אני אמור להציג את זה למשתמש והמשתמש אמור לבחור
ובואו נגיד שנוותר על כרגע על תצוגה ונמשיך בואו נדבר על וייב אאוט אז וייב אאוט אנחנו רוצים לפתוח ערוץ תקשורת לחומרה שזיהינו אז וייב אאוט get now devices החזירה לנו כמה התקנים יש עשינו לולה במקרה אנחנו ראינו שקיבלנו אחד בואו נראה את זה אה, לא מתקמפל? ככה
השארתי את זה? איזה יופי. אה, עכשיו זה לא מתקמפל. בסדר, צודק. אוקיי, אז out get num device, זאת אומרת לנו שיש device אחד, ו-rave out get device capabilities ממלא לנו את הפרמטרים האלה, אבל בסדר, האמת שזה כבר די מספק אותנו שיש device אחד.
עכשיו אנחנו פונים אליו, אז בואו נפנה אליו, אנחנו רוצים לפתוח ערוץ תקשורת אליו, ובהמשך נבין מה זה אומר לפתוח ערוץ תקשורת ולמה צריך לפתוח ערוץ תקשורת.
אוקיי, אז Wave Out Open, נתחיל מהסוף. למה אנחנו פותחים ערוץ תקשורת? המטרה היא לייצר את הדבר הזה, את ה-Handle ל-Wave Out. זה בעצם מייצג, זה מספר קטן ש-Wave Out Open תחזיר לנו והוא מייצג, בואו נשווה את זה, כמו שאני עושה פתיחה של כובד, כשאני מקבל איזשהו מזהה של הקובץ, או כמו שאני
מייצר חלון, אני מקבל מזהה של חלון. כך גם כשאני פותח ערוץ תקשורת מול device, אני מקבל את המזהה שלו, שהוא נכון לתוכנית הנוכחית, הוא לא מערכתי, ובהמשך ריצת התוכנית אני אפנה אל זה שאני ארצה לדבר אל החומרה. אני לא אפנה אל ה-i, אני לא אפנה ל-device.id, יפנה לערוץ ההתקשרות אליו ככה זה אוקיי אז ולמעשה אני יכול לפתוח כמה ערוצים במקביל וככה
אני יכול לנגן כמה דברים במקביל אין סתירה אז ככה זה אוקיי אז wave out open אנחנו מחלצים המטרה היא לחלץ את זה בעצם מה שמחזירה הפונקציה ההנדל לכן זה כתובת של אנחנו נותנים לפונקציה כתובת של הנדל לwave out הפונקציה ממלאה פה ערך ומחזירה לנו את הערך הממולה.
אז deviceid יהיה 0 לעת עתה בהמשך המשתמש יבחר את ה deviceid כמו שאפילו נגיד אולי בשלב זה למשתמש אולי נדפיס את זה לפחות אם לא בגוי אז לפחות שיהיה לנו הדפסות בואו ונדפיס את זה אז כאן זה עוד מוקדם מדי להדפיס כי יכול להיות שהנדל איירור מציגה הודעה למשתמש.
אה, אנחנו רוצים אבל שהנדל איירור תעצור את הריצה. אז אם יש לנו שגיאה על המסג'בוקס זה נחמד אבל אין טעם להמשיך את הריצה של התוכנית אם יש לנו שגיאה.
נכון, אני לא רוצה להציג לו שגיאה ואז פשוט להמשיך את הריצה של התוכנית. אז איך נעצור את זה? אז אולי במקום מסג'בוקס אני אזרוק אקספט שנעשה פה throw ואני אתפוס אותו במקום אחר, זה גם מעניין ואז התוכנית בעצם תעצר לנו, אז בואו נעשה את זה ככה, אז נשים פה try, אנחנו ב-c++ אז יש לנו try catch,
אנחנו לא בשפת c ושוב ננטל, עדיין לא הגענו לשם ופה נגמר ה-try שלנו, אז פה מתחיל ה-catch ואנחנו נתפוס את חריגות שלנו, אנחנו אולי נגדיר סוג של חריגה שלנו, אני לא יודע אם אני רוצה לכתוב ב-C פלס פס או ב-C אבל אני לא רואה סיבה לכתוב ב-C פלס פס אנחנו נגדיר פה את קלאס אודיו אירור לא ככה מגדירים קלאס ככה מגדירים קלאס עם נקודה פסיק בסוף ואודיו אירור יהיה קונסטרקטור אז חייבים לכתוב פאבליק
אודיו אירור הוא לא מזהה את זה עדיין נעשה סייב וקונטרול רווח אודיו אירור ומה אודיו אירור אם הוא עושה אודיו-איירו, יהיה לה שדה פרייבט N-סטרינג ב-C++, אבל יש טיצ'אר, מצביע לטיצ'אר, מצביע לזה, או שהוא יכיל את זה בעצמו?
אולי עדיף הוא יכיל את זה בעצמו. אז נהיה מצביע לזה. מצביע לזה, וזה יהיה המסג'. יפה, אז מה שאנחנו נקבל פה זה את קו תחתון tchar מצביע ל וזה יהיה המסאג' ופה אני אתחיל את מסאג' במסאג' זה לא טוב להתחיל מסאג' במסאג' נתחיל את מסאג' עם m גדולה במסאג' עם m קטנה.
יפה. כמו שאמר סטארלסטרופ קונסטרקטור ריק מלמד על תכנות נכון. יפה. אז זה האורגיו אירו שלי יש לו קונסטרקטור אבל הוא צריך גם צריך גם דרך לחלט את ה-error.get.message אז יש לנו את get.message כף תחתון טיצ'ר כוכבית.
get.message נעשה את זה ככה נעשה את זה ככה כאילו ככה יפה אז זה get.message ו-get.message מחזירה את את מסאג' שלנו, קונטרול רווח, את מסאג' שלנו, היא מחזירה את הפוינטר למסאג' שיש לנו, אוקיי? שזה די דומה לעשות את זה פאבליק, אז אם אני עושה את זה פאבליק, כל אחד יכול לבוא
ולשנות את זה, וזה לא מה שרציתי, ורציתי אבל שזה יהיה read-only, יש read-only? אין read-only, קונטס, אם אני אגיד שהוא קונטס, אני אנסה לקמפל את זה, קונטרול שיפט בי, אז מה הוא יצרך?
בואו נראה מה יש בפגיעות. cannot convert from const tchar כוכבית tchar כוכבית. יפה.
אז הוא מחזיר const ו-Ctrl-Shift-B. מה הבעיה שלו עם זה? או, זה int וזה u-int, אז בואו נגיד לו אין u-int אבל יש u-int. קונטרול שיפט u במקרה וקונטרול שיפט b.
וה-return 0, כן, יש פה catch נורא מוזר, אז בואו נצמצם את הcatch הזה לדבר שכזה, לא בריא לעשות return מתוך בלוק של trycatch, ננסה שוב לקמפל catch handlers, מה איתם, catch handlers, זה אומר specify one time באמת, ואם אני אומר 3 נקודות אני אקבל את זה, ctrl shift b, קיבל את זה, זה אומר קבל אני חושב כל exception שיש, קבל הכל, אוקיי, אבל זה לא מה שאני רוצה, כל מה שאני רוצה זה לקבל רק את אודיו ארור.
אולי כדאי לקרוא לזה אודיו אקספשן, בוא נצא F12. ואודיו אקספשן. כן, אבל אין לו עכשיו שאני את כולם. צריך לחזור לפה ולעשות קונטרול רווח. הוא עדיין מזהה את זה.
מוזר. עשיתי סייב, קונטרול, עכשיו כן השלים, שיהיה בריא. זה E-X, וכאן אנחנו נציג את ההודעת שגיאה. נכון, פה אנחנו רק בונים אותה ועוצרים את התוכנית.
יפה, ופה אנחנו נזרוק את החריגה. זאת אומרת, Handle Error, בסדר, איפה נעשה? פה נזרוק את החריגה? זאת אומרת, בוא נגיד שהוא Wave Out עם השנייה כן. זאת אומרת, אם טקסט נכשלה, אז אין לי טקסט.
אז אני מתוך פה אזרוק חריגה, ומתוך פה זה אומר מפה. אז זה throw n, throw new, כן, new, אודיו, אקספצ'ן, ואני נותן לו את טקסט, קונטרול רווח, אנטר, סגור.
אוקיי, יפה, אז אפשר לצמצם את זה, ו... כן, אפשר לצמצם את זה, ואפשר לצמצם הרבה דברים אפשר לצמצם פה, יפה, ו...
ונראה מי זה מתקבל, Control-Shift-B. אוה, מה הוא רוצה? הוא אומר ש... All constructors can have a base member initializer list.
זה לא קונסטרקטור, הוא צודק. כמה שהוא צודק. יפה, Control-Shift-B, build succeeded, עדיין יש לי בבטן משהו, בואו נוציא את זה, Control-V, בבקספייס, display יפה זה יהיה x נקודה get message w מאיפה הגיע שם הw איזה מוזר מסג' הוא פרייבט הוא לא זמין אבל get
message אבל למה w מה הוא יצר לי אוטומטית שני get מסיג'ים המטורף הזה ראיתם מה זה לא בגלל שיש פה teacher הוא מזהה את זה אז הוא צודק איפשהו איפשהו הוא צודק מאיזושהי בחינה מוזרה אוקיי, אז ex.getMessage יפה מאוד, זה שוב בילד אה, הוא שנייה זה ל-W, לא ציפיתי שאת זה הוא יעשה ו-Ctrl-Shift-B, הוא עדיין לא, מה, מה, מה
הוא רוצה? הוא אומר, function call missing argument list, use ampersand or the exception getMessageW to create a pointer to member אה, כי getMessage, מה הייתה?
GetMessage של E-X, מה בדיוק הבעיה? אה, מה הבעיה? הוא חושב שמה? מה הוא חושב? Function Call. איזה Function Call?
אה, GetMessage, זו פונקציה. בילד. אוקיי, הרבה יותר טוב, אבל אני לא אוהב קריאה לפונקציה, ואין פרופרטי, אז בואו נשים פה את MSG, וקונטרול v וקו תחתון text סליחה קו תחתון