portaudio

 
 

ऑडियो I/O के लिए ओपन सोर्स C लाइब्रेरी

विंडोज, macOS, लिनक्स और अन्य प्लेटफ़ॉर्म पर रियल-टाइम ऑडियो इनपुट और आउटपुट, ओपन सोर्स C API के माध्यम से।

PortAudio क्या है?

PortAudio एक मुफ्त, ओपन-सोर्स, क्रॉस-प्लेटफ़ॉर्म C लाइब्रेरी है जो डेवलपर्स को रीयल-टाइम इनपुट और आउटपुट क्षमताओं के साथ पोर्टेबल ऑडियो एप्लिकेशन लिखने में सक्षम बनाती है। यह ASIO, CoreAudio, ALSA, WASAPI, और JACK जैसे प्लेटफ़ॉर्म-विशिष्ट ऑडियो सबसिस्टम को एब्स्ट्रैक्ट करती है, जिससे Windows, macOS, Linux और अन्य ऑपरेटिंग सिस्टम्स में सुसंगत ऑडियो I/O संभव हो जाता है। यह लाइब्रेरी कई ऑडियो फ़ॉर्मेट्स—जिसमें 32-बिट फ़्लोटिंग पॉइंट शामिल है—को सपोर्ट करती है और आंतरिक रूप से फ़ॉर्मेट रूपांतरण को संभालती है। एक सरल फिर भी शक्तिशाली API के साथ, PortAudio का व्यापक उपयोग ऑडियो सॉफ़्टवेयर, प्लगइन्स, शैक्षिक उपकरण, और कम लेटेंसी, उच्च-प्रदर्शन ऑडियो प्रोसेसिंग की आवश्यकता वाले शोध प्रोजेक्ट्स में किया जाता है।

PortAudio दो मुख्य संचालन मोड प्रदान करता है: कॉलबैक-आधारित (कम-लेटेंसी स्ट्रीमिंग के लिए) और ब्लॉकिंग रीड/राइट (सरल सिंक्रोनस I/O के लिए)। इसमें विस्तृत दस्तावेज़ीकरण, उदाहरण प्रोग्राम, और परीक्षण उपयोगिताएँ शामिल हैं जो डेवलपर्स को जल्दी शुरू करने में मदद करती हैं। यह लाइब्रेरी एक वैश्विक समुदाय द्वारा रखरखाव की जाती है और MIT लाइसेंस के तहत लाइसेंस प्राप्त है, जिससे यह ओपन-सोर्स और व्यावसायिक दोनों अनुप्रयोगों के लिए उपयुक्त बनती है। चाहे आप एक डिजिटल ऑडियो वर्कस्टेशन, एक वॉयस रिकग्निशन टूल, या एक इंटरैक्टिव म्यूजिक एप्लिकेशन बना रहे हों, PortAudio क्रॉस-प्लेटफ़ॉर्म ऑडियो विकास के लिए एक विश्वसनीय, हल्का आधार प्रदान करता है।

Previous Next

PortAudio के साथ शुरुआत

PortAudio का उपयोग शुरू करने के लिए, आप इसे स्रोत से बना सकते हैं या पैकेज मैनेजर्स के माध्यम से स्थापित कर सकते हैं। अधिकांश डेवलपर्स के लिए, सबसे आसान तरीका आधिकारिक portaudio GitHub रिपॉज़िटरी को क्लोन करना और 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 समय-समय पर आपके कॉलबैक फ़ंक्शन को कॉल करता है ताकि ऑडियो डेटा की अनुरोध या आपूर्ति की जा सके। यह मोड आपको टाइमिंग पर सटीक नियंत्रण देता है और बफ़र अंडररन को न्यूनतम करता है। कॉलबैक इनपुट और आउटपुट बफ़र, फ्रेम काउंट, समय जानकारी, और स्टेटस फ़्लैग प्राप्त करता है—जिससे डायनेमिक ऑडियो जेनरेशन, इफ़ेक्ट्स प्रोसेसिंग, या विश्लेषण संभव होता है। चूंकि कॉलबैक एक हाई-प्रायोरिटी थ्रेड में चलता है, इसे तेज़ी से (आमतौर पर 10ms से कम) निष्पादित होना चाहिए ताकि गड़बड़ियों से बचा जा सके। यह इसे सिंथेसाइज़र, गिटार इफ़ेक्ट पेडल, या वॉयस कम्युनिकेशन सिस्टम जैसे लाइव ऑडियो एप्लिकेशन के लिए परफेक्ट बनाता है जहाँ निर्धारक प्रदर्शन महत्वपूर्ण है।

कॉलबैक के माध्यम से रीयल‑टाइम साइन वेव जेनरेटर

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 को पोर्टेबल ऑडियो टूल्स, शैक्षिक सॉफ़्टवेयर, और शोध फ्रेमवर्क के लिए आदर्श बनाती है, जिन्हें विविध हार्डवेयर और OS कॉन्फ़िगरेशन पर विश्वसनीय रूप से चलना चाहिए।

लिनक्स पर JACK होस्ट 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-बिट फ़्लोटिंग पॉइंट जैसे सुविधाजनक फ़ॉर्मेट का उपयोग कर सकते हैं जबकि अंतर्निहित सिस्टम मूल पूर्णांक फ़ॉर्मेट (जैसे, 16-बिट PCM) का उपयोग करता है। यह 8-, 16-, 24-, और 32-बिट पूर्णांक फ़ॉर्मेट के साथ-साथ 32-बिट फ़्लोट के बीच रूपांतरण का समर्थन करता है। अतिरिक्त रूप से, यह बिट-गहराई घटाने के दौरान वैकल्पिक डिथरिंग प्रदान करता है ताकि क्वांटाइज़ेशन शोर को न्यूनतम किया जा सके—एक सूक्ष्म लेकिन महत्वपूर्ण विशेषता उच्च-फ़िडेलिटी ऑडियो अनुप्रयोगों के लिए। डिथरिंग उच्च बिट गहराई से निम्न बिट गहराई में रूपांतरण करते समय ध्वनि की अनुभूत गुणवत्ता को बनाए रखती है। ये क्षमताएँ प्लेटफ़ॉर्म के बीच निरंतर ऑडियो फ़िडेलिटी सुनिश्चित करती हैं बिना डेवलपर्स को जटिल फ़ॉर्मेट-हैंडलिंग लॉजिक लागू करने की आवश्यकता के।

डिथरिंग के साथ 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
 हिन्दी