עבור לתוכן

כתיבה בסיסית לכרטיס קול

Featured Replies

פורסם

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

פורסם

יש פה כמה שאלות שצריך לענות עליהם:

1) איזה כרטיס קול?

2) איזו מערכת הפעלה?

3) האם אתה בטוח שזה מה שאתה צריך לעשות? יכול להיות שיש פתרון יותר טוב לבעיה האמיתית שאותה אתה מנסה לפתור. תספר לנו מהי?

עכשיו לכמה הצעות כלליות:

1) תחטט בקוד של לינוקס בדרייברים של כרטיסי קול.

2) תחטט פה: ftp://ftp.scene.org/mirrors/hornet/code/sound

3) תחטט שם: http://www.scene.org/dir.php?dir=%2Fresources%2F

4) תחטט כאן: http://www.s2.org/hmqaudio/

5) תחפש באינטרנט.

פורסם
  • מחבר

חבל שעוד לא עברתי ללינוקס...

אבל כרגע אני עובד ב-windows xp, ובאמת יש בעייה מאחורי זה שכבר פירסמתי ב thread בפורום של אודיו וניסיתי לחפש זווית אחרת לפתור אותה.

הבעייה היא כזו:

אני משמיע קובץ של raw samples בצורה הבאה -

אני משתמש בשפת תיכנות של ויז'ואל סטודיו C++ ובעזרת פקודה של ספרייה שנקראת winmm אני נותן פונקציות callback שהמערכת קוראת להם כדי לכתוב או לקרוא בפר ל/מ הכרטיס קול. הפונקציות נקראות בצורה אוטומטית אם אפשר לכתוב או אם מגיע בפר.

את מה שאני שולח אני מקליט ואז אני משווה בין הקובץ שאני הנשלח למה שהגיע, מתקבלים שני סוגי שגיאות:

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

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

כרטיס הקול שאני משתמש בו די איכותי -

M-audio audiophile delta 2496

פורסם

את ה- callback אתה מקבל ב- thread הראשי? יכול מאוד להיות שעדיף לך למלא את ה- buffer ב- thread נפרד.

ניסית להגדיל את ה- buffer?

פורסם

פה כבר כדאי שתשאל אנשים שמבינים בכתיבת אודיו תחת windows. לדוגמא ספריית SDL היא open source, עובדת גם ב-windows וגם בלינוקס, ויכולה להשמיע sound. אז אתה יכול להסתכל בקוד שלה ולראות איזה שיטה הם משתמשים. אתה גם יכול לשאול את המפתחים של הספריה לגבי הבעיה שלך, הם מסתובבים ב-IRC.

http://www.libsdl.org/index.php

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

בגדול אני מסכים עם boomerang: נראה לי שהמקרה הבעייתי (השני) הינו סוג של buffer underrun. אתה לא ממלא לדרייבר את ה-buffer בזמן, ולכן הוא שולח סתם שקט לכרטיס קול. בד"כ פתרון לבעיות כאלה היא הגדלת ה-buffer. נניח במקום buffer של 50 מילישניות תעבוד עם buffer של שניה שלמה. קח בחשבון שזה יגדיל את ה-latency כלומר הזמן שעובר משליחת ה-buffer עד לזמן השמעתו.

יתכן שאתה עובד עם API לא מתאים. אני מניח ש-DirectSound יתאים יותר לעבודה עם buffer-ים קטנים עם latency (השהיה) נמוך, ושהוא יציע שיטות מדוייקות יותר למילוי buffer.

פורסם
  • מחבר

ראיתי שלכרטיס קול אפשר לשנות את ההגדרות של ה buffer, זה קשור אלי? זאת אומרת אם רשום שם שהבפר הוא 256 אז כדי לתת

בפר של שנייה כמו שאמרת כדאי לי שיהיו בה מספר דגימות שמתחלק ב 256 (במקום 8000)?

פורסם

לא בדיוק. זה תלוי בקצב הדגימה שלך, ובגודל דגימה.

לדוגמא: אם אתה מנגן במונו דגימות של 8 ביט בקצב של 8000 דגימות לשניה, אז buffer של 8000 בתים יספיק לך לשניה של אודיו. אם אתה מנגן במונו דגימות של 16 ביט בקצב זהה, אז צריך buffer גדול פי 2 בשביל שניה של אודיו.

פורסם
  • מחבר

סבבה, אני משתמש ב8000 מה שאומר שיש לי חצי שנייה.

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

אבל הבעייה עדיין מופיעה אחת לכמה זמן.

פורסם

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

פורסם

אתה עובד ב-Polling או blocking?

כמה buffer-ים הדרייבר מטפל בהם בעצמו, או שאולי אתה כל פעם מאכיל רק buffer אחד ומחכה שיגמר?

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

פורסם
  • מחבר

אני משתמש בפקודה waveOutPause, כותב שני בפרים בעזרת waveOutWrite, ואז עושה waveOutRestart.

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

הבא.

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

פורסם
  • מחבר

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

אני אנסה לעבור ל direct sound ואם גם שם זה ככה אז אני חושב שהכרטיס לא משהו.

פורסם

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

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

למה שלא תעבוד עם נניח 3 או 4 buffer-ים? זה יתכן לך יותר זמן למלא buffer חדש בזמן שהאחרים מתנגנים.

כמו כן, נראה לי שמלבד בהתחלה, אין צורך כל פעם לעצור ולהמשיך (pause & restart). אתה יכול לשלוח buffer בזמן שהדרייבר מנגן את הקודמים. לפחות ככה לי נראה.

פורסם

בעבר הרחוק (לפני 7-8 שנים) השתתפתי בצבא בפרוייקט שבו נעשתה השמעה מקובץ באותו אופן, אבל שם השתמשנו בבאפר יחיד, ועדיין לא היו קפיצות.

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

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

דיונים חדשים