
portaudio
অডিও I/O এর জন্য ওপেন সোর্স C লাইব্রেরি
ওপেন সোর্স C API এর মাধ্যমে Windows, macOS, Linux এবং আরও সিস্টেমে রিয়েল-টাইম অডিও ইনপুট ও আউটপুট।
PortAudio কি?
PortAudio একটি ফ্রি, ওপেন-সোর্স, ক্রস-প্ল্যাটফর্ম C লাইব্রেরি যা ডেভেলপারদের রিয়েল-টাইম ইনপুট ও আউটপুট সক্ষমতা সহ পোর্টেবল অডিও অ্যাপ্লিকেশন লিখতে সক্ষম করে। এটি ASIO, CoreAudio, ALSA, WASAPI এবং JACK এর মতো প্ল্যাটফর্ম-নির্দিষ্ট অডিও সাবসিস্টেমগুলোকে বিমূর্ত করে, উইন্ডোজ, macOS, লিনাক্স এবং অন্যান্য অপারেটিং সিস্টেমে সামঞ্জস্যপূর্ণ অডিও I/O প্রদান করে। লাইব্রেরিটি একাধিক অডিও ফরম্যাট—যার মধ্যে ৩২-বিট ফ্লোটিং পয়েন্টও অন্তর্ভুক্ত—সমর্থন করে এবং অভ্যন্তরীণভাবে ফরম্যাট রূপান্তর পরিচালনা করে। সহজ কিন্তু শক্তিশালী API সহ, PortAudio অডিও সফটওয়্যার, প্লাগইন, শিক্ষামূলক টুল এবং কম লেটেন্সি, উচ্চ-প্রদর্শন অডিও প্রক্রিয়াকরণ প্রয়োজনীয় গবেষণা প্রকল্পে ব্যাপকভাবে ব্যবহৃত হয়।
PortAudio দুটি প্রধান অপারেশন মোড প্রদান করে: কলব্যাক-ভিত্তিক (কম লেটেন্সি স্ট্রিমিংয়ের জন্য) এবং ব্লকিং রিড/রাইট (সহজ সিঙ্ক্রোনাস I/O এর জন্য)। এতে বিস্তৃত ডকুমেন্টেশন, উদাহরণ প্রোগ্রাম এবং টেস্ট ইউটিলিটি অন্তর্ভুক্ত রয়েছে যা ডেভেলপারদের দ্রুত শুরু করতে সহায়তা করে। লাইব্রেরিটি একটি বিশ্বব্যাপী কমিউনিটি দ্বারা রক্ষণাবেক্ষণ করা হয় এবং MIT লাইসেন্সের অধীনে লাইসেন্সপ্রাপ্ত, যা এটি উভয়ই ওপেন-সোর্স এবং বাণিজ্যিক অ্যাপ্লিকেশনের জন্য উপযুক্ত করে। আপনি যদি একটি ডিজিটাল অডিও ওয়ার্কস্টেশন, ভয়েস রিকগনিশন টুল, অথবা একটি ইন্টারেক্টিভ মিউজিক অ্যাপ্লিকেশন তৈরি করছেন, PortAudio ক্রস-প্ল্যাটফর্ম অডিও ডেভেলপমেন্টের জন্য একটি নির্ভরযোগ্য, হালকা ভিত্তি প্রদান করে।
PortAudio দিয়ে শুরু করা
PortAudio ব্যবহার শুরু করতে, আপনি হয় সোর্স থেকে তৈরি করতে পারেন অথবা প্যাকেজ ম্যানেজার দিয়ে ইনস্টল করতে পারেন। অধিকাংশ ডেভেলপারদের জন্য সবচেয়ে সহজ পদ্ধতি হল অফিসিয়াল 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 পর্যায়ক্রমে আপনার কলব্যাক ফাংশনকে আহ্বান করে অডিও ডেটা অনুরোধ বা সরবরাহ করতে। এই মোড আপনাকে সময়ের উপর সুনির্দিষ্ট নিয়ন্ত্রণ দেয় এবং বাফার আন্ডাররান কমায়। কলব্যাক ইনপুট এবং আউটপুট বাফার, ফ্রেম সংখ্যা, সময়ের তথ্য এবং স্ট্যাটাস ফ্ল্যাগ গ্রহণ করে—যা ডায়নামিক অডিও জেনারেশন, ইফেক্টস প্রসেসিং বা বিশ্লেষণকে সক্ষম করে। যেহেতু কলব্যাক একটি উচ্চ-প্রাধান্য থ্রেডে চলে, এটি দ্রুত (সাধারণত 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()` এর মতো ফাংশন ব্যবহার করে জিজ্ঞাসা করতে পারেন। এটি অ্যাপ্লিকেশনগুলোকে ব্যবহারকারীদের জন্য বৈধ ডিভাইসের তালিকা উপস্থাপন এবং স্ট্রিমগুলোকে সর্বোত্তমভাবে কনফিগার করার সুযোগ দেয়। আপনি ডিফল্ট ডিভাইস সনাক্ত করতে, সমর্থিত স্যাম্পল রেট পরীক্ষা করতে এবং ন্যূনতম/সর্বোচ্চ লেটেন্সি নির্ধারণ করতে পারেন। এই নমনীয়তা কনফিগারযোগ্য অডিও টুল, 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 ইমপ্লিমেন্টেশনের মাধ্যমে বিমূর্ত করে, যা অপারেটিং সিস্টেম জুড়ে সামঞ্জস্যপূর্ণ আচরণ নিশ্চিত করে। 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-বিট ফ্লোটও সমর্থন করে। অতিরিক্তভাবে, এটি বিট-ডেপথ হ্রাসের সময় ঐচ্ছিক ডিথারিং প্রদান করে যাতে কোয়ান্টাইজেশন নয়েজ কমানো যায়—একটি সূক্ষ্ম কিন্তু গুরুত্বপূর্ণ বৈশিষ্ট্য উচ্চ-ফিডেলিটি অডিও অ্যাপ্লিকেশনের জন্য। ডিথারিং উচ্চ বিট ডেপথ থেকে নিম্ন বিট ডেপথে রূপান্তরের সময় শোনার গুণমান বজায় রাখে। এই সক্ষমতাগুলি প্ল্যাটফর্ম জুড়ে ধারাবাহিক অডিও ফিডেলিটি নিশ্চিত করে, ডেভেলপারদের জটিল ফরম্যাট-হ্যান্ডলিং লজিক নিজে বাস্তবায়ন করতে না হয়।
ডিথারিং সহ ৩২-বিট ফ্লোট ইনপুট কনফিগার করুন
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
