portaudio

 
 

ไลบรารี C แบบโอเพนซอร์สสำหรับ I/O เสียง

การรับและส่งเสียงแบบเรียลไทม์บน Windows, macOS, Linux และอื่น ๆ ผ่าน API C แบบโอเพนซอร์ส.

PortAudio คืออะไร?

PortAudio เป็นไลบรารี C ฟรี, โอเพ่นซอร์ส, ข้ามแพลตฟอร์ม ที่ช่วยให้นักพัฒนาสามารถเขียนแอปพลิเคชันเสียงแบบพกพาที่มีความสามารถในการรับและส่งสัญญาณแบบเรียลไทม์ มันทำหน้าที่เป็นชั้นนามธรรมสำหรับระบบย่อยเสียงเฉพาะแพลตฟอร์ม เช่น ASIO, CoreAudio, ALSA, WASAPI, และ JACK ทำให้การรับส่งเสียงทำงานอย่างสม่ำเสมอบน Windows, macOS, Linux และระบบปฏิบัติการอื่น ๆ ไลบรารีนี้รองรับรูปแบบเสียงหลายประเภท รวมถึงแบบ 32-bit floating point และจัดการการแปลงรูปแบบภายใน ด้วย API ที่เรียบง่ายแต่ทรงพลัง PortAudio ถูกใช้กันอย่างกว้างขวางในซอฟต์แวร์เสียง, ปลั๊กอิน, เครื่องมือการศึกษา, และโครงการวิจัยที่ต้องการการประมวลผลเสียงที่มีความหน่วงต่ำและประสิทธิภาพสูง

PortAudio มีโหมดการทำงานหลักสองแบบ: แบบเรียกกลับ (สำหรับการสตรีมที่มีความหน่วงต่ำ) และแบบบล็อกการอ่าน/เขียน (สำหรับ I/O แบบซิงโครนัสที่ง่ายกว่า) มันรวมถึงเอกสารที่ครอบคลุม ตัวอย่างโปรแกรม และยูทิลิตี้ทดสอบเพื่อช่วยให้นักพัฒนาสามารถเริ่มต้นได้อย่างรวดเร็ว ไลบรารีนี้ได้รับการดูแลโดยชุมชนระดับโลกและได้รับใบอนุญาตภายใต้ MIT license ทำให้เหมาะสำหรับทั้งแอปพลิเคชันโอเพนซอร์สและเชิงพาณิชย์ ไม่ว่าคุณจะกำลังสร้างดิจิทัลออดิโอเวิร์กสเตชัน เครื่องมือจดจำเสียง หรือแอปพลิเคชันดนตรีแบบโต้ตอบ 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

การสตรีมเสียงแบบเรียลไทม์ด้วย Callback

โหมดสตรีมแบบเรียกกลับของ PortAudio เหมาะสำหรับการประมวลผลเสียงแบบเรียลไทม์ที่มีความหน่วงต่ำ เมื่อเริ่มสตรีม PortAudio จะเรียกฟังก์ชัน callback ของคุณเป็นระยะเพื่อขอหรือส่งข้อมูลเสียง โหมดนี้ให้การควบคุมเวลาที่แม่นยำและลดการขาดแคลนบัฟเฟอร์ callback จะรับบัฟเฟอร์อินพุตและเอาต์พุต จำนวนเฟรม ข้อมูลเวลา และแฟล็กสถานะ — ทำให้สามารถสร้างเสียงแบบไดนามิก ประมวลผลเอฟเฟกต์ หรือวิเคราะห์ได้ เนื่องจาก callback ทำงานในเธรดระดับสูง จึงต้องดำเนินการอย่างรวดเร็ว (โดยทั่วไปภายในต่ำกว่า 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();

การสนับสนุน Host API ข้ามแพลตฟอร์ม

PortAudio แยกส่วน API ด้านเสียงที่เฉพาะแพลตฟอร์มผ่านการนำเสนอ Host API แบบโมดูลาร์ เพื่อให้พฤติกรรมสอดคล้องกันในทุกระบบปฏิบัติการ บน Windows รองรับ ASIO (สำหรับเสียงระดับมืออาชีพ), WASAPI (Vista+), DirectSound และ MME รุ่นเก่า macOS ใช้ Core Audio เพื่อความหน่วงต่ำมาก ในขณะที่ Linux รองรับ ALSA, JACK และ PulseAudio ระบบ BSD ใช้ OSS หรือ sndio นักพัฒนาสามารถเขียนโค้ดครั้งเดียวแล้วปรับใช้ได้ทุกที่—ไม่ต้องมีการคอมไพล์แบบมีเงื่อนไขสำหรับตรรกะหลัก ไลบรารีจะเลือก Host API ที่ดีที่สุดโดยอัตโนมัติหรือให้คุณระบุอย่างชัดเจน ความหลากหลายนี้ทำให้ PortAudio เหมาะสำหรับเครื่องมือเสียงแบบพกพา ซอฟต์แวร์การศึกษา และกรอบงานวิจัยที่ต้องทำงานอย่างเชื่อถือได้บนฮาร์ดแวร์และการกำหนดค่า OS ที่หลากหลาย

บังคับใช้ JACK Host API บน Linux

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);

การแปลงรูปแบบเสียงและการทำ Dithering

PortAudio จัดการการแปลงรูปแบบตัวอย่างภายในอย่างโปร่งใส ทำให้ลูกค้าสามารถใช้รูปแบบที่สะดวกเช่น 32-bit floating point ในขณะที่ระบบพื้นฐานใช้รูปแบบจำนวนเต็มแบบดั้งเดิม (เช่น 16-bit PCM) ได้ มันรองรับการแปลงระหว่างรูปแบบจำนวนเต็ม 8-, 16-, 24- และ 32-bit รวมถึง 32-bit float นอกจากนี้ยังมีการให้เลือกใช้การทำดิธเทอร์ (dithering) ระหว่างการลดความลึกบิตเพื่อบรรเทาเสียงควอนติไซเซชัน — คุณลักษณะที่ละเอียดแต่สำคัญสำหรับแอปพลิเคชันเสียงคุณภาพสูง ดิธเทอร์ช่วยรักษาคุณภาพเสียงที่รับรู้ได้เมื่อแปลงจากความลึกบิตสูงไปยังความลึกบิตต่ำ ความสามารถเหล่านี้ทำให้มั่นใจว่าความคมชัดของเสียงสอดคล้องกันข้ามแพลตฟอร์มโดยไม่ต้องให้ผู้พัฒนาต้องเขียนตรรกะการจัดการรูปแบบที่ซับซ้อนด้วยตนเอง

กำหนดค่าอินพุตแบบ 32-bit Float พร้อม Dithering

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
 ไทย