1. منتجات
  2.   صوتي
  3.   C++
  4.   portaudio

portaudio

 
 

مكتبة C مفتوحة المصدر للإدخال/الإخراج الصوتي

إدخال وإخراج صوتي في الوقت الحقيقي عبر Windows و macOS و Linux وغيرها عبر واجهة برمجة تطبيقات C المفتوحة المصدر.

ما هو portaudio؟

PortAudio هي مكتبة C مجانية ومفتوحة المصدر ومتعددة المنصات تمكّن المطورين من كتابة تطبيقات صوتية محمولة مع قدرات الإدخال والإخراج في الوقت الحقيقي. تقوم بتجريد الأنظمة الفرعية الصوتية الخاصة بالمنصات مثل ASIO وCoreAudio وALSA وWASAPI وJACK، مما يسمح بإدخال وإخراج صوتي متسق عبر Windows وmacOS وLinux وغيرها من أنظمة التشغيل. تدعم المكتبة صيغ صوتية متعددة — بما في ذلك النقطة العائمة 32-بت — وتتعامل مع تحويل الصيغ داخليًا. بفضل واجهة برمجة تطبيقات بسيطة لكنها قوية، تُستخدم PortAudio على نطاق واسع في برامج الصوت، والإضافات، والأدوات التعليمية، ومشاريع البحث التي تتطلب معالجة صوتية منخفضة الكمون وعالية الأداء.

توفر PortAudio وضعين أساسيين للتشغيل: وضع يعتمد على الاستدعاءات (للتحويل منخفض الكمون) ووضع القراءة/الكتابة الحاجزة (لـ I/O المتزامن الأبسط). تشمل وثائق واسعة، برامج أمثلة، وأدوات اختبار لمساعدة المطورين على البدء بسرعة. تُصان المكتبة من قبل مجتمع عالمي وتُرخص تحت رخصة MIT، مما يجعلها مناسبة لكل من التطبيقات المفتوحة المصدر والتجارية. سواءً كنت تبني محطة عمل صوتية رقمية، أو أداة التعرف على الصوت، أو تطبيق موسيقي تفاعلي، فإن PortAudio توفر أساسًا موثوقًا وخفيف الوزن لتطوير الصوت عبر الأنظمة.

Previous Next

البدء مع portaudio

لبدء استخدام PortAudio، يمكنك إما بناءه من المصدر أو التثبيت عبر مديري الحزم. بالنسبة لمعظم المطورين، أسهل طريقة هي استنساخ المستودع الرسمي GitHub الخاص بـ portaudio وتجميله باستخدام CMake أو autotools. على نظام Linux، قم بالتثبيت عبر `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 باستدعاء دالتك بشكل دوري لطلب أو تزويد بيانات الصوت. يمنحك هذا الوضع تحكمًا دقيقًا في التوقيت ويقلل من نقص المخزن المؤقت. يتلقى الاستدعاء مخازن الإدخال والإخراج، وعدد الإطارات، ومعلومات الوقت، وعلامات الحالة — مما يتيح توليد صوت ديناميكي، أو معالجة مؤثرات، أو تحليل. نظرًا لأن الاستدعاء يعمل في خيط عالي الأولوية، يجب أن ينفذ بسرعة (عادةً أقل من 10 مللي ثانية) لتجنب الأخطاء. وهذا يجعله مثاليًا لتطبيقات الصوت الحي مثل المولّدات، دواسات مؤثرات الجيتار، أو أنظمة التواصل الصوتي حيث الأداء الحتمي أمر حاسم.

مولد موجة جيبية في الوقت الفعلي عبر الاستدعاء الراجع

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 واجهات برمجة تطبيقات قوية لتعداد وفحص أجهزة الصوت المتاحة — بما في ذلك أجهزة الإدخال والإخراج — بالإضافة إلى قدراتها. يمكن للمطورين الاستعلام عن أسماء الأجهزة، عدد القنوات، معدلات العينة الافتراضية، وقيم الكمون باستخدام دوال مثل `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();

دعم واجهة برمجة التطبيقات المضيفة عبر الأنظمة

يُجَزّء PortAudio واجهات برمجة التطبيقات الصوتية الخاصة بالمنصات من خلال تنفيذات مضيفة API معيارية، مما يضمن سلوكًا متسقًا عبر أنظمة التشغيل. على نظام Windows، يدعم ASIO (للصوت الاحترافي)، WASAPI (Vista+)، DirectSound، وMME القديمة. يستفيد macOS من Core Audio للحصول على زمن استجابة منخفض جدًا، بينما يدعم Linux ALSA وJACK وPulseAudio. تستخدم أنظمة BSD OSS أو sndio. يكتب المطورون مرة واحدة وينشرون في كل مكان—لا حاجة لتجميع شرطي للمنطق الأساسي. تختار المكتبة تلقائيًا أفضل واجهة مضيفة متاحة أو تسمح لك بتحديد واحدة صراحة. تجعل هذه الشمولية PortAudio مثاليًا لأدوات الصوت المحمولة، والبرمجيات التعليمية، وأطر البحث التي يجب أن تعمل بثقة على أجهزة وتكوينات نظام تشغيل متنوعة.

فرض استخدام واجهة برمجة تطبيقات JACK Host على لينكس

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-بت بينما يستخدم النظام الأساسي تنسيقات صحيحة أصلية (مثل PCM 16-بت). يدعم التحويل بين تنسيقات الأعداد الصحيحة 8-، 16-، 24-، و32-بت، وكذلك النقطة العائمة 32-بت. بالإضافة إلى ذلك، يقدم خيار التشويش (dithering) أثناء تقليل عمق البت لتقليل ضوضاء التكميم—ميزة دقيقة ولكنها حاسمة لتطبيقات الصوت عالية الدقة. يحافظ التشويش على جودة الصوت المتصورة عند التحويل من أعماق بت أعلى إلى أقل. تضمن هذه القدرات الحفاظ على دقة الصوت عبر المنصات دون الحاجة إلى أن يقوم المطورون بتنفيذ منطق معقد لمعالجة التنسيقات بأنفسهم.

تكوين إدخال عائم 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
 عربي