הסבר על המבנה של audio_stream_out
#include <
audio.h
>
שדות נתונים |
|
struct audio_stream | נפוץ |
uint32_t(* | get_latency )(const struct audio_stream_out *stream) |
int(* | set_volume )(struct audio_stream_out *stream, float left, float right) |
ssize_t(* | write )(struct audio_stream_out *stream, const void *buffer, size_t bytes) |
int(* | get_render_position )(const struct audio_stream_out *stream, uint32_t *dsp_frames) |
int(* | get_next_write_timestamp )(const struct audio_stream_out *stream, int64_t *timestamp) |
int(* | set_callback )(struct audio_stream_out *stream, stream_callback_t callback, void *cookie) |
int(* | pause )(struct audio_stream_out *stream) |
int(* | resume )(struct audio_stream_out *stream) |
int(* | drain )(struct audio_stream_out *stream, audio_drain_type_t type) |
int(* | flush )(struct audio_stream_out *stream) |
int(* | get_presentation_position )(const struct audio_stream_out *stream, uint64_t *frames, struct timespec *timestamp) |
תיאור מפורט
audio_stream_out הוא ממשק האבסטרקציה של חומרת פלט האודיו.
הוא מספק מידע על מאפיינים שונים של מנהל החומרה של פלט האודיו.
מסמכי תיעוד של שדה
struct audio_stream common |
שיטות נפוצות להעברת אודיו. הוא חייב להיות המשתנה הראשון ב- audio_stream_out , כי משתמשים במבנה הזה יהפכו את audio_stream למצביע audio_stream_out בהקשרים שבהם ידוע ש- audio_stream מפנה ל- audio_stream_out .
int(* drain)(struct audio_stream_out *stream, audio_drain_type_t type) |
שליחת בקשה לקבלת התראה כשנתונים שנשמרו במטמון על ידי הנהג/החומרה הושמעו. אם set_callback() נקראת בעבר כדי להפעיל מצב ללא חסימה, drain() לא צריכה לחסום. במקום זאת, היא צריכה לחזור במהירות ולהודיע על השלמת הניקוז באמצעות קריאה חוזרת. אם לא התבצעה קריאה ל- set_callback() , הקריאה ל- drain() חייבת לחסום עד לסיום. אם type==AUDIO_DRAIN_ALL, תהליך הניקוז מסתיים אחרי שהנתונים שנכתבו בעבר הושמעו. אם type==AUDIO_DRAIN_EARLY_NOTIFY, תהליך הניקוז מסתיים זמן קצר לפני שהנתונים של הטראק הנוכחי מושמעים, כדי לתת ל-framework זמן לבצע מעבר לטראק ללא הפסקה.
Drain חייב לחזור מיד אחרי קריאה ל-stop() ול- flush()
יש להטמיע את הפונקציה הזו כדי להפעיל את ההעברה.
int(* flush)(struct audio_stream_out *stream) |
uint32_t(* get_latency)(const struct audio_stream_out *stream) |
int(* get_next_write_timestamp)(const struct audio_stream_out *stream, int64_t *timestamp) |
int(* get_presentation_position)(const struct audio_stream_out *stream, uint64_t *frames, struct timespec *timestamp) |
הפונקציה מחזירה ספירה עדכנית של מספר הפריימים של האודיו שהוצגו למתבונן חיצוני. הנתונים האלה לא כוללים פריימים שכבר נכתבו אבל עדיין נמצאים בצינור עיבוד הנתונים. המספר לא מתאפס כשהפלט עובר למצב המתנה. הפונקציה מחזירה גם את הערך של CLOCK_MONOTONIC נכון למספר ההצגות הזה. המספר המוחזר אמור להיות 'עדכני', אבל הוא לא חייב להיות הערך העדכני ביותר האפשרי. עם זאת, הזמן המשויך צריך להתאים למספר שמוחזר. דוגמה: נניח שהוצגו N+M פריימים, כאשר M הוא מספר 'קטן'. במקרה כזה, מותר להחזיר את הערך N במקום N+M, וחותמת הזמן צריכה להתאים ל-N ולא ל-N+M. המונחים 'אחרון' ו 'קטן' לא מוגדרים. הם משקפים את איכות ההטמעה.
3.0 ואילך בלבד.
int(* get_render_position)(const struct audio_stream_out *stream, uint32_t *dsp_frames) |
int(* pause)(struct audio_stream_out *stream) |
מודיע למנהל האודיו להפסיק את ההפעלה, אבל מאגרי הנתונים שנמצאים בתור נשמרים בחומרה. שימושי להטמעת השהיה/המשך. עם זאת, אם אין תמיכה בהטמעה ריקה, צריך להטמיע אותה בחומרה עם זמן אחזור לא טריוויאלי. במצב השהיה, חומרת האודיו עדיין עשויה לצרוך חשמל. המשתמש יכול לשקול לבצע קריאה להשהיה לאחר זמן קצוב לתפוגה.
יש להטמיע את הפונקציה הזו כדי להפעיל את ההעברה.
int(* resume)(struct audio_stream_out *stream) |
int(* set_callback)(struct audio_stream_out *stream, stream_callback_t callback, void *cookie) |
int(* set_volume)(struct audio_stream_out *stream, float left, float right) |
ssize_t(* write)(struct audio_stream_out *stream, const void *buffer, size_t bytes) |
כתיבת מאגר האודיו לנהג. הפונקציה מחזירה את מספר הבייטים שנכתבו, או את הערך השלילי status_t. אם לפחות פריים אחד נכתב בהצלחה לפני השגיאה, מומלץ שהדרייבר יחזיר את מספר הבייטים (הקצר) שהועברו בהצלחה, ולאחר מכן יחזיר שגיאה בקריאה הבאה.
אם הקריאה ל- set_callback() בוצעה בעבר כדי להפעיל מצב ללא חסימה, אסור ל- write() לחסום. הוא צריך לכתוב רק את מספר הבייטים שמתאימים כרגע למאגר של התוכנה או החומרה, ואז להחזיר את מספר הבייטים הזה. אם הוא קטן מגודל הכתיבה המבוקש, צריך לקרוא לפונקציית הקריאה החוזרת כשיהיה מקום פנוי נוסף במאגר הנתונים הזמני של ההתקן או של מנהל ההתקן.
התיעוד של המבנה הזה נוצר מהקובץ הבא:
- hardware/libhardware/include/hardware/ audio.h