
portaudio
کتابخانه منبع باز C برای ورودی/خروجی صوتی
ورودی و خروجی صوتی زمان واقعی در ویندوز، macOS، لینوکس و سایر سیستمها از طریق API منبع باز C.
پورتآودیو چیست؟
PortAudio یک کتابخانهٔ رایگان، متنباز و چندپلتفرمی زبان C است که به توسعهدهندگان امکان میدهد برنامههای صوتی قابل حمل با قابلیتهای ورودی و خروجی زمان واقعی بنویسند. این کتابخانه زیرسیستمهای صوتی خاص هر پلتفرم مانند ASIO، CoreAudio، ALSA، WASAPI و JACK را انتزاع میکند و ورودی/خروجی صوتی سازگار را در ویندوز، macOS، لینوکس و سایر سیستمعاملها فراهم میسازد. این کتابخانه از فرمتهای صوتی متعدد، از جمله ۳۲ بیتی شناور، پشتیبانی میکند و تبدیل فرمت را بهصورت داخلی انجام میدهد. با یک API ساده اما قدرتمند، PortAudio بهطور گسترده در نرمافزارهای صوتی، افزونهها، ابزارهای آموزشی و پروژههای تحقیقاتی که به پردازش صوتی با تأخیر کم و عملکرد بالا نیاز دارند، استفاده میشود.
PortAudio دو حالت اصلی عملیات را فراهم میکند: مبتنی بر فراخوانی (برای پخش با تأخیر کم) و خواندن/نوشتن مسدودکننده (برای ورودی/خروجی همزمان سادهتر). این کتابخانه شامل مستندات گسترده، برنامههای نمونه و ابزارهای تست است تا به توسعهدهندگان کمک کند به سرعت شروع کنند. این کتابخانه توسط یک جامعه جهانی نگهداری میشود و تحت مجوز MIT منتشر شده است، که آن را برای برنامههای منبع باز و تجاری مناسب میسازد. چه در حال ساخت یک ایستگاه کاری دیجیتال صوتی، یک ابزار تشخیص صدا، یا یک برنامه موسیقی تعاملی باشید، PortAudio پایهای قابل اعتماد و سبک برای توسعه صوتی چندپلتفرمی ارائه میدهد.
شروع کار با پورتآودیو
برای شروع استفاده از PortAudio، میتوانید یا آن را از منبع بسازید یا از طریق مدیران بسته نصب کنید. برای اکثر توسعهدهندگان، سادهترین روش این است که مخزن رسمی GitHub پورتآودیوی را کلون کنید و با استفاده از CMake یا autotools کامپایل کنید. در لینوکس، با `apt install portaudio19-dev` نصب کنید؛ در macOS، از `brew install portaudio` استفاده کنید؛ در ویندوز، باینریهای پیشساخته را دانلود کنید یا از vcpkg (`vcpkg install portaudio`) استفاده کنید. پس از نصب، `portaudio.h` را شامل شوید و در برابر کتابخانه لینک بدهید (`-lportaudio`). این کتابخانه سبک وزن است و وابستگیهای کمی دارد، که ادغام آن را برای برنامههای صوتی زمان واقعی ساده میکند.
نصب پورتآودیو از طریق مدیران بسته
# Linux (Debian/Ubuntu)
sudo apt install portaudio19-dev
# macOS (Homebrew)
brew install portaudio
# Windows (vcpkg)
vcpkg install portaudio
پخش صوتی زمان واقعی با بازخوانیها
حالت استریم مبتنی بر کالبک PortAudio برای پردازش صوتی با تأخیر کم و زمان واقعی ایدهآل است. وقتی یک استریم شروع میشود، PortAudio بهطور دورهای تابع کالبک شما را برای درخواست یا تأمین دادههای صوتی فراخوانی میکند. این حالت کنترل دقیق بر زمانبندی را به شما میدهد و از کمبود بافر جلوگیری میکند. کالبک بافرهای ورودی و خروجی، تعداد فریمها، اطلاعات زمان و پرچمهای وضعیت را دریافت میکند—که امکان تولید صوتی پویا، پردازش افکتها یا تجزیه و تحلیل را فراهم میآورد. از آنجا که کالبک در یک رشته با اولویت بالا اجرا میشود، باید بهسرعت (معمولاً زیر ۱۰ میلیثانیه) اجرا شود تا از بروز اشکال جلوگیری شود. این ویژگی آن را برای برنامههای صوتی زنده مانند سینتسایزرها، پدالهای افکت گیتار یا سیستمهای ارتباط صوتی که عملکرد قطعی حیاتی است، مناسب میسازد.
تولیدکننده موج سینوسی زمان واقعی از طریق بازخوانی
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()`، نام دستگاهها، تعداد کانالها، نرخ نمونهبرداری پیشفرض و مقادیر تأخیر را پرس و جو کنند. این امکان به برنامهها اجازه میدهد تا به کاربران فهرستی از دستگاههای معتبر ارائه دهند و جریانها را بهینه پیکربندی کنند. همچنین میتوانید دستگاههای پیشفرض را شناسایی کنید، نرخهای نمونهبرداری پشتیبانیشده را بررسی کنید و حداقل/حداکثر تأخیرها را تعیین کنید. این انعطافپذیری برای ساخت ابزارهای صوتی قابل تنظیم، DAWها یا ضبطکنندههای صدا که به تنظیمات سختافزاری متنوع بدون نیاز به پیکربندی دستی سازگار میشوند، ضروری است.
فهرست تمام دستگاههای صوتی موجود
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های صوتی خاص هر پلتفرم را انتزاع میکند و رفتار یکسانی را در تمام سیستمعاملها تضمین میکند. در ویندوز، از ASIO (برای صداهای حرفهای)، WASAPI (Vista+)، DirectSound و MME قدیمی پشتیبانی میکند. macOS از Core Audio برای تأخیر فوقالعاده کم بهره میبرد، در حالی که لینوکس از ALSA، JACK و PulseAudio پشتیبانی میکند. سیستمهای BSD از OSS یا sndio استفاده میکنند. توسعهدهندگان میتوانند یک بار بنویسند و در همه جا اجرا کنند—بدون نیاز به کامپایل شرطی برای منطق اصلی. کتابخانه بهصورت خودکار بهترین API میزبان موجود را انتخاب میکند یا اجازه میدهد که بهصورت صریح یکی را مشخص کنید. این همهجانبهگی PortAudio را برای ابزارهای صوتی قابل حمل، نرمافزارهای آموزشی و چارچوبهای پژوهشی که باید بهصورت قابل اعتماد بر روی سختافزارها و پیکربندیهای مختلف سیستمعامل اجرا شوند، ایدهآل میسازد.
اجبار استفاده از API میزبان JACK در لینوکس
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 بهصورت شفاف تبدیل فرمت نمونه داخلی را مدیریت میکند و به مشتریان اجازه میدهد از فرمتهای راحت مانند عدد شناور ۳۲ بیتی استفاده کنند، در حالی که سیستم زیرین از فرمتهای عدد صحیح بومی (مثلاً PCM ۱۶ بیتی) استفاده میکند. این کتابخانه از تبدیل بین فرمتهای عدد صحیح ۸، ۱۶، ۲۴ و ۳۲ بیتی، همچنین عدد شناور ۳۲ بیتی پشتیبانی میکند. علاوه بر این، امکان دیترینگ اختیاری در هنگام کاهش عمق بیت برای کاهش نویز کوانتیزه شدن را فراهم میآورد—ویژگیای ظریف اما حیاتی برای برنامههای صوتی با دقت بالا. دیترینگ کیفیت صوتی ادراکشده را هنگام تبدیل از عمق بیت بالاتر به پایینتر حفظ میکند. این قابلیتها اطمینان میدهند که وفاداری صوتی بهصورت یکنواخت در سراسر پلتفرمها حفظ شود بدون اینکه توسعهدهندگان مجبور به پیادهسازی منطق پیچیدهٔ مدیریت فرمت شوند.
پیکربندی ورودی ۳۲ بیتی شناور با دیترینگ
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
