กันยายน 15, 2019, 01:34:34 pm *
ยินดีต้อนรับคุณ, บุคคลทั่วไป กรุณา เข้าสู่ระบบ หรือ ลงทะเบียน
ส่งอีเมล์ยืนยันการใช้งาน?

เข้าสู่ระบบด้วยชื่อผู้ใช้ รหัสผ่าน และระยะเวลาในเซสชั่น
   หน้าแรก   ช่วยเหลือ เข้าสู่ระบบ สมัครสมาชิก  
หน้า: [1]   ลงล่าง
  พิมพ์  
ผู้เขียน หัวข้อ: waveInX Functions -- 03 -- waveInGetDevCaps()  (อ่าน 2396 ครั้ง)
0 สมาชิก และ 1 บุคคลทั่วไป กำลังดูหัวข้อนี้
ShadowMan
Administrator
Hero Member
*****
ออฟไลน์ ออฟไลน์

เพศ: ชาย
กระทู้: 8272


ShadowWares


| |
« เมื่อ: ธันวาคม 27, 2010, 09:53:19 am »

ในตอนที่ผ่านมาเราได้ทำการตรวจสอบดูแล้วว่าในเครื่องคอมพิวเตอร์หรือในระบบของเรามี Sound Driver อยู่กี่ตัว ตอนนี้มาดูกันว่า Driver แต่ละตัวชื่ออะไร และรองรับ format ที่เราต้องการหรือเปล่า?
การขอรายละเอียดของ Driver สามารใช้ฟังก์ชั่น waveInGetDevCaps() ซึ่งฟังก์ชั้นนี้ต้องการพารามิเตอร์ 3 ตัวคือ
   1. Device ID : เป็นตัวเลขใดๆ ที่ใช้อ้างถึง Driver จะมีค่าเริ่มจาก 0 ไปจนถึง จำนวนของ Driver ในระบบด้วย 1 (0 คือตัวแรก)
   2. WAVEINCAPS structure : เป็นตัวแปรแบบโครงสร้างที่ใช้ในการจัดเก็บรายละเอียดของ Driver ที่อ้างถึงโดย Device ID (ใน 1.) ฟังก์ชั่น waveInGetDevCaps() จะเป็นผู้เขียนข้อมูลลงในตัวแปรนี้
   3. ขนาดของตัวแปรโครสร้าง WAVEINCAPS : การเรียกใช้งานฟังก์ชัน  waveInGetDevCaps() (และหลายฟังก์ชั่นที่เป็น API ของ Windows) จำเป็นต้องบอกขนาด ของตัวแปรโครงสร้างที่ถูกต้อง ไม่เช่นนั้นการทำงานจะผิดพลาด ขนาดของตัวแปรใดๆ สามารถเรียกใช้ฟังก์ชั่น sizeof() ได้


ตัวอย่างการใช้งาน waveInGetDevCaps() ดังนี้:
Code:
WAVEINCAPS wc;
unsigned int id;

if(waveInGetDevCaps(id, &wc, sizeof(wc)) !=  MMSYSERR_NOERROR) {
    // มีข้อผิดพลาด !!
}

ฟังก์ชัน waveInGetDevCaps() จะรัเทิร์นผลการทำงานมาให้ทราบ ถ้าค่าที่รีเทิร์นมาไม่เท่ากับ MMSYSERR_NOERROR แสดงว่ามีข้อผิดพลาดเกิดขึ้นแล้ว ซึ่งอาจจะเกิดขึ้นได้หลากหลายกรณี อ่านเพิ่มเพิมได้ที่นี่

ดูโปรแกรมตัวอย่างครับ:
Code: (c)
int main(void){
    unsigned int NumDevs;
    WAVEINCAPS wc;
    NumDevs = waveInGetNumDevs();
    printf("NumDevs = %d\n", NumDevs);

    for(int id=0; id<NumDevs; id++){
         if(waveInGetDevCaps(id, &wc, sizeof(wc)) != MMSYSERR_NOERROR)
            printf("\tDriver ID = %d, Errro !\n", id);
         else
            printf("\tDriver ID = %d, Driver Name = %s\n", id, wc.szPname);
    }

    printf("\nPress any key to exit.");
    getchar(); return 0;
}

และนี่คือผลการทำงานของโปรแกรม:


จะเห็นได้ว่าเครื่องผมมี Driver อยู่สองตัว ตามรูปด้านบน ต่อไปมาลองตรวจสอบกันดูว่า Driver แต่ละตัวรองรับรูปแบบ หรือ format ที่เราต้องการหรือเปล่า ยกตัวอย่างเช่นผมต้องการรับสัญญาณเสียงมาเป็น WAVE ที่มี Sampling Rate เท่ากับ 44.1 kHz แบบ Stereo และแต่ละ Sample มีขนาด 16 บิต จะมีวิธีการตรวจสอบกันอย่างไร
ก่อนอื่นให้เข้าไปดูรายละเอียดของ dwFormats ของตัวแปรโครงสร้าง WAVEINCAPS กันก่อน ดูได้ที่นี่ จะเขียนว่า Format ที่ผมต้องการถูกกำหนดไว้เป็น WAVE_FORMAT_4S16 ต่อไปลองมาตรวจสอบดูว่า Driver ทั้งสองตัวนี้รองรับ Format นี้หรือเปล่า? ดูตัวอย่างครับ

Code:
if(wc.dwFormats & WAVE_FORMAT_4S16){
       // รองรับ
else
    // ไม่รองรับ
}

มาถึงตอนนี้เราก็ทราบแล้วว่าเครื่องคอมพิวเตอร์ของเรามี Sound Driver อะไรอยู่บ้าง แต่ละตัวรองรับรูปแบบที่เราต้องการหรือเปล่า เมื่อการตรวจสอบเบื้องต้นนี้ผ่านมาได้ด้วยดี พร้อมแล้วที่จะทำการเชื่อมต่อไปยัง Driver เพื่อทำการรับ/ส่ง สัญญาณเสียง ในตอนต่อมาว่ากันครับ
** รายละเอียดมามากมายนะครับ จำเป็นต้องอ่านเอกสารของ Microsoft ประกอบไปด้วยเสมอ เพราะผมจะไม่กล่าวถึงได้ทั้งหมด **

บันทึกการเข้า

By SDW: Do No Wrong Is Do Nothing
          If you want to increase your success rate, double your failure rate
หน้า: [1]   ขึ้นบน
  พิมพ์  
 
กระโดดไป: