PracticU

Audio - Recording waveIn

בלי כתוביותעם כתוביות
PracticU › קורס C למתקדמים - עבודה מול חומרה Win32 › Audio - Recording waveIn
מילון מושגים:
בינארי - ייצוג מידע בבסיס 2 בעזרת הספרות 0 ו-1. גם קובץ הכולל קוד מכונה ולא טקסט קריא.
מערך - מבנה נתונים שמאחסן אוסף ערכים מאותו סוג ברצף, שאפשר לגשת אליהם לפי מספר מיקום (אינדקס).
Callback - פונקציה שמועברת כארגומנט לפונקציה אחרת כדי שתופעל מאוחר יותר, לרוב בסיום פעולה.
מעבד - יחידת העיבוד המרכזית של המחשב, שמבצעת את הפקודות של התוכניות ומנהלת את החישובים.
פונקציה - קטע קוד בעל שם שמבצע משימה מוגדרת, מקבל ערכי קלט (פרמטרים) ויכול להחזיר תוצאה. מאפשרת לארגן קוד ולהשתמש בו שוב.

Audio - Recording waveIn
ההרצאה עוסקת בהקלטה מהמיקרופון: פתיחת התקן קלט עם waveInOpen, הכנת מאגרים, התחלת ההקלטה וניגון חוזר של מה שהוקלט. בדרך נתקלים בשגיאות שממחישות את חשיבות סדר הקריאות ואת העתקת המבנים.
השלבים העיקריים
1. תשובות לשאלות קודמות: המילה unsigned משפיעה בעיקר על ההדפסה ועל האופן שבו מציגים את הערך. בפועל דגימה מייצגת ערך בין 0 ל-255, ולכן לא מעניין אותנו מינוס. ההרצאה הבטיחה לחזור לבסיסי המספרים (דצימלי, אוקטלי, בינארי) בהזדמנות אחרת.
2. פתיחת התקן הקלט: waveInGetNumDevs מחזירה את מספר התקני הקלט, ו-waveInGetDevCaps ממלאת את היכולות של כל אחד. הפורמט של ההקלטה חייב להיות זהה לפורמט של הניגון, אחרת הניגון יצא מהר או לאט מדי. התקן נפתח עם waveInOpen.
3. הכנת המאגר: בונים מערך של unsigned char בגודל 8,000 בתים, כלומר שנייה אחת, מאפסים את WAVEHDR ומציבים לו את הכתובת והאורך.
4. הכנה והוספה: waveInPrepareHeader מכינה את המאגר, ו-waveInAddBuffer מוסרת אותו לחומרה. אפשר להוסיף מאגרים מראש, והחומרה כותבת לתוכם כשההקלטה פעילה.
5. התחלה: waveInStart מתחילה את ההקלטה. המאגר חוזר לתוכנית כשהוא מלא, ואורך מה שנכתב נמצא ב-dwBytesRecorded. תיבת הודעה מסבירה למשתמש שההקלטה נמשכת שנייה ומסתיימת.
6. ניגון חוזר: אותו מאגר מועבר ל-waveOutWrite ומנוגן דרך כרטיס הקול. ההרצאה הקליטה את המשפט "הלו משה" והשמיעה אותו חזרה.
קריאות ומבנים
- waveInGetDevCaps(i, &caps, sizeof(WAVEINCAPS)) ממלאת את היכולות של התקן קלט.
- waveInOpen(&hwi, deviceId, &wfx, 0, 0, ...) נפתחת ללא callback (הערך 0).
- waveInPrepareHeader ו-waveInAddBuffer נקראות לפני waveInStart.
- אין לנגן באמצע ההקלטה, כי הניגון יירשם גם הוא ויעלה את עומס המעבד.
שימו לב
- העברת WAVEHDR לפונקציה כעותק: הפונקציה עובדת על העתק, והמבנה המקורי לא מתעדכן. ההרצאה תיקנה את זה והעבירה כתובת (מצביע).
- ההודעה "הכותרת לא הוכנה" מופיעה כשמוסיפים מאגר לפני שהכנתם אותו. קוראים ל-prepare קודם.
- MSDN סותר את עצמו לגבי דגל PREPARED בכותרת. ההרצאה החליטה לא לקבוע את הדגל ידנית, וקריאה ל-waveInPrepareHeader הספיקה לתפקוד תקין.
- בלי המתנה התוכנית נסגרת לפני שההקלטה מסתיימת, ולכן צריך לחכות לאישור מהמשתמש.
בסיום, מה שהוקלט ניגן חזרה דרך אותו פורמט, ובכך נסגר המעגל מהקלטה לניגון.

פרקי ההרצאה: Audio - Recording waveIn

  1. 00:00

    פתיחת פרויקט ההקלטה waveIn

  2. 00:41

    שאלות על מספרים: בינארי ו-Unsigned

  3. 02:42

    Flags של WAVEHDR לפי התיעוד

  4. 03:55

    סתירה בתיעוד: מתי מסמנים Prepared

  5. 06:42

    המרת unsigned char ל-LPSTR

  6. 08:40

    ההיגיון מול התיעוד: סדר הקריאות

  7. 10:38

    התוכנית נסגרת לפני שהצליל מתנגן

  8. 11:55

    קליטת קלט מהמשתמש לפני הסגירה

תמלול ההרצאה: Audio - Recording waveIn

הטקסט המלא של הדקות הראשונות בהרצאה «Audio - Recording waveIn» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.

  1. 00:02

    טוב, אנחנו ממשיכים בעולם הניגונים. אז בואו נפתח את הוויז'ואל סטודיו. דווקא רציתי שזה יישאר פתוח לי. יופי, טוב לי. את זה נגדיל, נלך לאודיו 0.1, נסגור את הסטארט פייג'.

  2. 00:31

    ונשאלתי כמה שאלות. השאלה הראשונה שנשאלתי היא, רוצים דיון, תלמידים רוצים דיון על אקסה דצימלי ועל דצימלי ועל אוקטלי ועל בינארי, אז בהזדמנות אחרת נעשה את הדיון הזה.

  3. 00:46

    זה יכול להיות אפילו שזה סדרה של הרצאות. באוניברסיטה בדרך כלל זה קורס בפני עצמו, או לפחות תחילה של קורס, זה כמה הרצאות ראשונות. אז אני לא יודע אם בזה נטפל כרגע. דבר שני, נשאלתי לגבי Unsigned, מה פירוש ה-Unsigned.

  4. 01:02

    אז גם זה בהזדמנות צריך ללמד את זה בצורה מסודרת. אבל מה שזה אומר זה שהמשתנה מסוג unsigned לא יודע להציג, הוא לא מציג מינוס. אם אני מדפיס אותו הכל פה קשור להדפסות.

  5. 01:26

    בין אם זה unsigned או signed או unsigned או כלום זה רלוונטי בעצם להדפסה. כי מבחינת המחשב אין הבדל מה שאני נותן לו גם אם זה unsigned הוא יודע לאכול מינוס. השאלה היא רק איך הוא מצפיץ את זה, איך הוא מציג את זה. מבחינת מה שיש לו בבטן אין הבדל.

  6. 01:46

    אם אני אומר לו מינוס אחד, בכל מקרה אין דבר כזה מינוס במחשב. מחשב בנוי ממעגלים חשמליים שדולקים או קבועים, מאפס ואחדים.

  7. 01:56

    אז מה זה אומר שזה מינוס? אז יש לו איזושהי דרך לדעת מתי להציג את זה עם מינוס לפני זה ומתי לא להציג את זה עם מינוס, אבל זה רק המינוס, זה רלוונטי רק לתצוגה לא בעצם לא נכון זה גם רלוונטי לפעולות חשבוניות אבל מאחורי הקלעים לא משנה בקיצור בהזדמנות אחרת נדון בזה ונתעמק בזה לא לעכשיו כרגע כל מה שאנחנו אומרים זה

  8. 02:30

    שזה לא מעניין את דעת המינוס אנחנו אומרים שזה בין 0 ל-255 אלה הערכים ולכן זה Unsigned זה לא מעניין אותנו מינוס אז עשינו את זה Unsigned והשאלה האחרונה שנשאלתי הייתה לגבי הפלאגס של הפריפר הדר או של האופן או של מי, איפה היה הפלאגס? זהו, של הווייב הדר.

  9. 02:58

    את הווייב הדר יש את הדרך אחת של פלאגס שבכלל לא טיפלנו בו ועדיין הכל עובד, אז סקרן אותנו איך זה קרה. אז בואו נעשה אולי F1 על ווייב הדר.

  10. 03:11

    הנה ווייב הדר, בואו נעשה לו סינק. יפה, אנחנו נמצאים אגב באזור של אסטרקטים. באזור של אסטרקטים ליד הפאנקשן של המולטימדיה רפרנס.

  11. 03:23

    פה נמצאות הפונקציות, הנה הווייבים ופה נמצאים אסטרקטים, תמיד זה אותו מבנה. לא משנה איפה אתם ב-MSDN, תמיד יש רפרנס, ברפרנס יש פאנקשן סטרקצ'רס או כל מיני דברים אחרים.

  12. 03:39

    יפה. אז זה ההדר, אז בואו נראה מה הוא אומר לגבי הפלאגס, הוא אומר לגבי הפלאגס שזה יכול להיות Begin Loop, זה יכול להיות Done, זה יכול להיות N Loop, אוקיי בוא נראה מה זה, מה זה, מה זה, בוא נעשה דברים, Windows to indicate that the buffer has been prepared.

  13. 04:04

    אבל מה אנחנו אמורים לשים שם? פה לא כתוב מה אנחנו, פלאגס, פלאגס, supply information about the buffer, reformed and redefined, אבל מי אמור לשים מה, איפה? בואו נראה מה לגבי פריפר הדר, הנה פריפר הדר, F1, בואו נגדיל את זה, אז פרפר הדר רימארקס דה אלפי דאטה באפר לינקס דה פלאגס ממרז אוף דה הדר פונקצ'ון מאז די סט

  14. 04:37

    בפור קולינג דה פונקצ'ון דיס פונקצ'ון. ראינו שזה לא נכון, דה פלאגס ממרז מאז די סט טו או פרפרד או בגין או בו אין לופ. אני לא מתפלא שפרפרד זה אפס.

  15. 04:49

    בואו נבדוק מה זה w h d r כף תחתון פרפרד. אז הנה w h ונגיד שw ווייב הדר נקודה די דאבליו פלאגס שווה ל... עוד פעם, אני כבר לא זוכר. דאבליו איידש די אר דאבליו איידש די אר כף תחתון פריפרדף שתים עשרה ושתיים.

  16. 05:17

    סט איף דיס הדר אשבין פריפרד. אוקיי, אז מה שהוא אומר זה משהו נורא מוזר. הוא אומר, דפלאגס דלינקס ביסט טו או זה או זה או זה. ודפלאגס חייבים לקרוא לו לפני.

  17. 05:34

    הפלאגס לינקס ולופס ממבר אוף דה ווי ודה סטארצ'ר קן צ'יינג' ביטווין קולס טו דיס פונקצ'ן אנד דה רייט פונקצ'ן. יווני פלאגסט קן צ'יינג' לסינדרלס ודה פלאגס ממבר אוף דה ביגינופ אנד לופס.

  18. 05:47

    איף יו צ'יינג' סייז בפור רייט דה ניו ווילי מאסט בי לתן דה פריפרד וליו. פרפיילד אין לו שום אפקט. אוקיי, בואו נראה, ושהוא פריפרד. אם נלך רגע לבאק, אז הוא יכול להיות פריפרד.

  19. 06:22

    אה, אנחנו שמים אותו פריפרד. זה לא מובן לי. מה המשמעות של זה? אבל אני חושב שאני... הרי פריפר הדר מכין את ההדר, אז הייתי אומר שאחרי שקוראים לו פריפר הדר, רק אז זה נהיה פריפרד.

  20. 06:37

    בואו נשים פה ברייק פוינט ונריץ אותו. כרגע זה לא מדאיג אותנו כי זה עובד, אבל כשדברים מפסיקים לעבוד, אז אנחנו מתחילים לחפש חשודים, ואז כל מה שלא עשינו לפי הדוקומנטציה הופך להיות חשוד.

  21. 06:54

    שווה כנות קונבאות from unsigned, הנה בעיה, from unsigned charred 8000 to LPSTR. נכון, זה מאחורי הכליל זה unsigned, אז כדי שזה יהיה בסדר, אז אני אמיר אותו ל-LPSTR, CTRL-SHIFT-B. קיבל את זה, בואו נריץ את זה.

  22. 07:17

    יפה, 0, Enter, וזה. מייבדר, ככה וככה, וזה בכלל לא מעניין אותנו. מה שאותנו מעניין טיפה יותר זה הברייק פוינט הבא.

  23. 07:37

    יפה. ומה קרה עם יבש שווה? כמובן שזה כרגע 0, בואו נדלג על זה רגע ונגיד לו פריפר. הוא אומר, הכל עבר בשלום, מה עכשיו הערך של?

  24. 07:54

    הערך שלו זה 2, 2 זה פריפרד, הוא פריפרד, עכשיו הוא פריפרד. אני לא יודע למה הם אומרים שצריך להגיד שהוא prepared לפני שעושים prepared, זה לא נשמע לי הגיוני.

  25. 08:06

    אני לא הייתי קורא לזה. נשמע שהדוקומנטציה פה משהו לא בסדר. הוא גם אומר prepared by Windows. Windows נותן את הערך הזה, to indicate the buffer has been prepared with the wave in or wave out prepared ahead of function. נו, אז זה בסתירה מפורשת למה שכתוב כאן.

  26. 08:36

    The flags members must be set to prepared, טוב פה הוא לא אומר את זה, אבל פה, The flags members must be set before calling this function. יפה, אז הגענו לסתירה בדוקמנטציה עצמה, ומי שלדעתי מכריע זה א', ההיגיון, וב', העובדה שזה עובד. ההיגיון אומר, אין היגיון שאני אתן לו ערך prepared לפני שאני קורא לו.

  27. 09:04

    מעניין אותי מה יקרה אם באמת נעשה מה שאחד מהצדדים ב-MSDN אומר. עשר ועכשיו אני אקרא לו וזה לא משפיע זאת אומרת זה גם בסדר הכל בסדר יפה זה לא משנה אבל בכל זאת אני אישית לא הייתי עושה מה שאומרים ב-MSDN כי הם אומרים דבר והיפוכו וצריך להחליט מה לעשות וההיגיון אומר שאנחנו לא נעשה את זה מה שאומר לי ההיגיון וזה גם עובד בלי יפה

  28. 09:36

    זה דבר ראשון. דבר שני שרצינו זה שכשמשתמש מפעיל את המערכת מבחוץ ממערכת הקבצים אם רצינו שעדיין המערכת תעבוד לו, לא רק שהוא מדבק מתוך הוויז'ול סטודיו.

  29. 09:49

    מה שאנחנו ראינו זה כשהפעלנו בהרצאה הקודמת את המערכת, אנחנו גילינו, אם ניגש ל-1 ול-1, אז נגיד לו 0.

  30. 10:05

    או, זה מעניין. The way of adder was not prepared. Use the prepare function to prepare the adder and then try again. זה מעניין.

  31. 10:15

    מה הוא רוצה? הוא הפעיל את מה שעכשיו קימפלנו. אולי לא כי לא שמרנו בואו למרות שעשינו בילד בוא נעשה לו F6 אמור לבנות את זה ויז'ל סטודיו מה יכול היה להיות לו ויז'ל סטודיו איך הוא קשור לסיפור לא יודע בוא נעשה שוב להריץ נגיד לו אפס כן בכל מקרה הוא נסגר בטרם זמנו הוא לא מצליח הוא לא מספיק להשמיע את הצליל

  32. 10:57

    עאוט ווייב אאוט רייט פונה לחומרה ואומרת לה תנגני תנגני אבל אז מיד מיין מסתיימת וכשמיין מסתיימת מערכת ההפעלה מנקה אחרי מיין וסוגרת את כל מה שהפרוסס פתח ואחד מהדברים היא סוגרת את הערוץ ומבטלת את הרייטס יפה אז אנחנו לא שומעים כלום אז מה שצריך זה להגיד למשתמש אם סייארת אז צריכה אתה לאנטר אז סי אאוט סי

  33. 11:32

    אאוט פליז היט אנטר ון רדי טו קוויט ואנד ליין ואז סי אין לתוך איזשהו משתנה אז נגדיר משתנה דאמי חייבים אין פה אין פה זה למרות שאני יכול להשתמש בסי אין נקודה גט מה זה גט ליין?

  34. 12:09

    גט ליין, אי אפשר להבין מה הדבר הזה עושה. גט ליין, אני מקבלת פוינט, אני עדיין צריכה משהו. מה עם גט שר? גט, זה מקבל כלום, וגט, מקבל הרבה מאוד, וגט לוק, כל זה, גט לוקל, הוא בכלל מחדיר את הלוקל, הוא מחדיר את השפה המקומית.

  35. 12:47

    אוקיי, אבל מה לגבי סתם, יש פונקציה get char, get c, get c עובדת עם קובץ ו-get r מחזירה את char, אני חושב שהיא לא ממתינה למקלדת ו-get e, יש get c, get char echo גם לא טוב לנו, get c אמרנו גם לא טוב, יש את כנף, כנף מחכה ל-enter,

  36. 13:29

    אבל היא גם תרצה משתנה אני חושב אחרת היא תתחרפן. בקיצור אין הרבה ברירה צריך להגדיר פה משתנה דאמי אז נגדיר int דאמי ופשוט נקלוט לתוכו tn לתוך דאמי וזה בעצם ה-enter ובלי breakpoint אם נריץ ונגיד לו 0 enter הוא מנגן והוא אומר please enter זה ואני אומר לו enter אמרתי לו נגיד לו enter עוד פעם הוא מחכה למשהו הוא

  37. 14:18

    חכם מדי הוא רוצה משהו זה גם כן בעייתי אני לא רוצה אני רוצה שהוא פשוט יעשה זה בואו ננסה בואו נראה מה קורה עם גט שער F5 טכניקולה פסיק ונריץ 0 enter ואני צפצף ו-enter טוב עדיין קוראים לזה בואו נראה איפה הוא נמצא כרגע אם הוא עבר את הגט על הגט מה הוא רוצה זה process?

  38. 15:11

    it has to be deadlocked or is not running any user mode code all threads have been stopped מה על מה הוא מדבר מה הוא רוצה לא יודע מה הוא רוצה זה לא מעניין אותנו

לקורס המלא: קורס C למתקדמים אונליין

ההרצאה הקודמת: Audio - waveOutWrite

ההרצאה הבאה: Create File

קורסים נוספים במסלול

  • קורס WinForms - תוכנות רגילות בווינדוס
  • פרויקט מעשי ב-#C - בונים מחשבון פשוט
  • פרויקט מעשי ב-#C - ספר טלפונים
  • פרויקט מעשי ב-#C - תוכנת צייר
  • קורס ADO.NET - חיבור אתר למסד נתונים
  • קורס תכנות מתקדם - #Advanced .NET C