
portaudio
ספריית C בקוד פתוח לקלט/פלט שמע
קלט ופלט שמע בזמן אמת במערכות Windows, macOS, Linux ועוד באמצעות API C בקוד פתוח.
מהו PortAudio?
PortAudio היא ספריית C חינמית, קוד פתוח, חוצת פלטפורמות המאפשרת למפתחים לכתוב יישומי שמע ניידים עם יכולות קלט ופלט בזמן אמת. היא מאפשטת תתי‑מערכות שמע ספציפיות לפלטפורמה כגון ASIO, CoreAudio, ALSA, WASAPI, ו‑JACK, ומאפשרת קלט/פלט שמע עקבי ב‑Windows, macOS, Linux ומערכות הפעלה אחרות. הספרייה תומכת במגוון פורמטים של שמע — כולל נקודה צפה של 32‑ביט — ומטפלת בהמרת פורמט פנימית. עם API פשוט אך חזק, PortAudio משמשת נרחבות בתוכנות שמע, תוספים, כלי חינוך ופרויקטי מחקר הדורשים עיבוד שמע בעל השהייה נמוכה וביצועים גבוהים.
PortAudio מספקת שני מצבי פעולה עיקריים: מבוסס קריאה חוזרת (לזרימה בעלת השהייה נמוכה) וקריאה/כתיבה חוסמת (ל‑I/O סינכרוני פשוט יותר). היא כוללת תיעוד נרחב, תוכניות דוגמה, וכלי בדיקה כדי לעזור למפתחים להתחיל במהירות. הספרייה מתוחזקת על ידי קהילה גלובלית ורשומה ברישיון MIT, מה שהופך אותה למתאימה הן לפרויקטים קוד פתוח והן ליישומים מסחריים. בין אם אתה בונה תחנת עבודה דיגיטלית לאודיו, כלי זיהוי קול, או יישום מוזיקה אינטראקטיבי, PortAudio מספקת בסיס אמין וקל משקל לפיתוח אודיו חוצה פלטפורמות.
התחלה עם PortAudio
להתחיל להשתמש ב‑PortAudio, אתה יכול לבנות אותו מהמקור או להתקין דרך מנהלי חבילות. עבור רוב המפתחים, השיטה הקלה ביותר היא לשכפל את מאגר PortAudio GitHub הרשמי ולבצע קומפילציה באמצעות CMake או autotools. בלינוקס, התקן באמצעות `apt install portaudio19-dev`; ב‑macOS, השתמש ב‑`brew install portaudio`; ב‑Windows, הורד קבצים בינאריים מוכנים מראש או השתמש ב‑vcpkg (`vcpkg install portaudio`). לאחר ההתקנה, כלול `portaudio.h` וקשר נגד הספרייה (`-lportaudio`). הספרייה קלה משקל ויש לה תלות מינימלית, מה שהופך את האינטגרציה לפשוטה עבור יישומי שמע בזמן אמת.
התקנת PortAudio דרך מנהלי חבילות
# Linux (Debian/Ubuntu)
sudo apt install portaudio19-dev
# macOS (Homebrew)
brew install portaudio
# Windows (vcpkg)
vcpkg install portaudio
הזרמת אודיו בזמן אמת עם פונקציות חזרה
מצב הזרמת המבוסס על קריאות חזרה של PortAudio אידיאלי לעיבוד שמע בזמן אמת ובשיהוי נמוך. כאשר מתחילים זרם, PortAudio קורא באופן תקופתי לפונקציית הקריאה חזרה שלך כדי לבקש או לספק נתוני שמע. מצב זה נותן שליטה מדויקת על התזמון ומצמצם חוסר במלאי (buffer underruns). הקריאה חזרה מקבלת חוצצים של קלט ופלט, ספירת פריימים, מידע זמן, ודגלי סטטוס—מאפשרת יצירת שמע דינמית, עיבוד אפקטים, או ניתוח. מכיוון שהקריאה חזרה פועלת בחוט בעל עדיפות גבוהה, היא חייבת להתבצע במהירות (בדרך כלל מתחת ל‑10 ms) כדי למנוע תקלות. זה עושה אותה מושלמת ליישומי שמע בזמן אמת כגון סינתסייזרים, פדלים לאפקטים לגיטרה, או מערכות תקשורת קולית שבהן ביצועים דטרמיניסטיים קריטיים.
מחולל גל סינוס בזמן אמת באמצעות Callback
typedef struct {
float phase;
float phase_increment;
} paTestData;
int patestCallback(const void *input, void *output,
unsigned long frameCount,
const PaStreamCallbackTimeInfo* timeInfo,
PaStreamCallbackFlags statusFlags,
void *userData)
{
paTestData *data = (paTestData*)userData;
float *out = (float*)output;
for (unsigned long i = 0; i < frameCount; i++) {
*out++ = sinf(data->phase);
data->phase += data->phase_increment;
if (data->phase >= M_PI * 2) data->phase -= M_PI * 2;
}
return paContinue;
}
רשימת מכשירים ושאילתות
PortAudio מספקת ממשקי API חזקים למיפוי ובדיקה של מכשירי שמע זמינים — כולל מכשירי קלט ופלט — יחד עם היכולות שלהם. מפתחים יכולים לשאול על שמות המכשירים, מספר ערוצים, קצב הדגימה ברירת המחדל, וערכי השיהוי באמצעות פונקציות כגון `Pa_GetDeviceCount()`, `Pa_GetDeviceInfo()`, ו-`Pa_GetDefaultInputDeviceID()`. זה מאפשר ליישומים להציג למשתמשים רשימת מכשירים תקינים ולהגדיר זרמים באופן אופטימלי. ניתן גם לזהות מכשירי ברירת מחדל, לבדוק קצבי דגימה נתמכים, ולקבוע השיהויים מינימליים/מקסימליים. גמישות זו חיונית לבניית כלי שמע ניתנים להגדרה, תחנות עבודה דיגיטליות (DAWs) או מקליטי קול המתאימים למגוון תצורות חומרה ללא צורך בתצורה ידנית.
רשום את כל מכשירי השמע הזמינים
PaError err;
err = Pa_Initialize();
if (err != paNoError) goto error;
int numDevices = Pa_GetDeviceCount();
for (int i = 0; i < numDevices; i++) {
const PaDeviceInfo *info = Pa_GetDeviceInfo(i);
printf("%d: %s (in: %d, out: %d)\n",
i, info->name,
info->maxInputChannels,
info->maxOutputChannels);
}
Pa_Terminate();
תמיכה בממשק API של מארח חוצה פלטפורמות
PortAudio מאמת את ממשקי ה‑API של שמע ספציפיים לפלטפורמה דרך יישומי API מארחים מודולריים, ומבטיח התנהגות עקבית בין מערכות הפעלה. ב‑Windows, הוא תומך ב‑ASIO (לשמע מקצועי), WASAPI (Vista+), DirectSound ו‑MME הישנה. macOS מנצל את Core Audio לשיהוי נמוך מאוד, בעוד Linux תומך ב‑ALSA, JACK ו‑PulseAudio. מערכות BSD משתמשות ב‑OSS או sndio. המפתחים כותבים פעם אחת ומפרסמים בכל מקום—אין צורך בקומפילציה מותנית עבור הלוגיקה המרכזית. הספרייה בוחרת אוטומטית את ה‑API המארח הטוב ביותר הזמין או מאפשרת לך לציין אחד במפורש. אוניברסליות זו עושה את PortAudio אידיאלית לכלי שמע ניידים, תוכנות חינוכיות, ומסגרות מחקר שצריכות לפעול באופן אמין על חומרה ומערכות הפעלה מגוונות.
הכרח שימוש ב‑JACK Host API בלינוקס
PaStreamParameters inputParam, outputParam;
PaError err;
inputParam.device = Pa_GetHostApiInfoByType(paJACK)->defaultInputDevice;
inputParam.channelCount = 2;
inputParam.sampleFormat = paFloat32;
// ... configure outputParam similarly ...
PaStream *stream;
err = Pa_OpenStream(&stream, &inputParam, &outputParam,
44100, 256, paNoFlag, callback, NULL);
המרת פורמט אודיו ודיתרינג
PortAudio מטפל בהמרת פורמט דגימה פנימי בצורה שקופה, מאפשר ללקוחות להשתמש בפורמטים נוחים כמו נקודה צפה של 32‑bit בעוד שהמערכת הבסיסית משתמשת בפורמטים של מספרים שלמים מקומיים (למשל, PCM של 16‑bit). הוא תומך בהמרה בין פורמטים של 8‑, 16‑, 24‑ ו‑32‑bit של מספרים שלמים, וכן בפורמט של 32‑bit float. בנוסף, הוא מציע דיתרינג אופציונלי במהלך הפחתת עומק הביטים כדי למזער רעש קוונטיזציה – תכונה עדינה אך קריטית ליישומי אודיו באיכות גבוהה. דיתרינג משמר את איכות השמע הנתפסת בעת המרה ממעמקי ביט גבוהים לנמוכים יותר. יכולות אלו מבטיחות עקביות באיכות השמע על פני פלטפורמות מבלי לדרוש מהמפתחים ליישם לוגיקה מורכבת לטיפול בפורמטים בעצמם.
הגדר קלט צף 32‑ביט עם דיתרינג
PaStreamParameters inputParam = {0};
inputParam.device = Pa_GetDefaultInputDevice();
inputParam.channelCount = 2;
inputParam.sampleFormat = paFloat32;
inputParam.suggestedLatency = Pa_GetDeviceInfo(inputParam.device)->defaultLowInputLatency;
// Enable dithering for output conversion
PaStream *stream;
Pa_OpenStream(&stream, &inputParam, NULL, 44100, 128,
paClipOff | paDitherOff, NULL, NULL);
// Note: paDitherOff disables dithering; omit for default dithering
