คำเตือน: OpenSL ES เลิกใช้งานแล้ว นักพัฒนาซอฟต์แวร์ควรใช้ไลบรารี Oboe แบบโอเพนซอร์สซึ่งมีอยู่ใน GitHub Oboe เป็น Wrapper ของ C++ ที่มี API ที่คล้ายกับ AAudio มาก โอโบเรียก AAudio เมื่อ AAudio เป็น ว่าง และจะกลับไปใช้ OpenSL ES หาก AAudio ไม่พร้อมใช้งาน
OpenSL ES สำหรับ Android ขยายข้อกำหนดอ้างอิง OpenSL ES เพื่อให้เข้ากันได้กับ Android และใช้ประโยชน์จากความสามารถและความยืดหยุ่นของแพลตฟอร์ม Android
คําจํากัดความของ API สําหรับส่วนขยาย Android จะอยู่ใน OpenSLES_Android.h
และไฟล์ส่วนหัวที่รวมอยู่ด้วย โปรดดูรายละเอียดเกี่ยวกับส่วนขยายเหล่านี้ที่ OpenSLES_Android.h
ไฟล์นี้จะอยู่ในรูทการติดตั้งของคุณในไดเรกทอรี sysroot/usr/include/SLES
เว้นแต่จะเป็นอย่างอื่น
อินเทอร์เฟซทั้งหมดมีการแสดงอย่างชัดเจน
ส่วนขยายเหล่านี้จะจำกัดความสามารถในการถ่ายโอนของแอปพลิเคชัน
การใช้งาน OpenSL ES อื่นๆ เพราะมีไว้สำหรับ Android โดยเฉพาะ คุณสามารถลดปัญหานี้ได้โดย
หลีกเลี่ยงการใช้ส่วนขยายหรือใช้ #ifdef
เพื่อยกเว้นส่วนขยายขณะคอมไพล์
ตารางต่อไปนี้แสดงอินเทอร์เฟซและตัวระบุข้อมูลเฉพาะของ Android ที่ Android OpenSL ES รองรับสำหรับออบเจ็กต์แต่ละประเภท ค่า Yes ในเซลล์ระบุอินเทอร์เฟซและตัวระบุข้อมูลที่ใช้ได้กับออบเจ็กต์แต่ละประเภท
ฟีเจอร์ | โปรแกรมเล่นเสียง | โปรแกรมบันทึกเสียง | เครื่องยนต์ | ส่วนผสมของเอาต์พุต |
---|---|---|---|---|
คิวบัฟเฟอร์ของ Android | ใช่: ต้นฉบับ (ถอดรหัส) | ไม่ | ไม่ได้ | ไม่ |
การกําหนดค่า Android | ใช่ | ได้ | ไม่ได้ | ไม่ |
เอฟเฟกต์ Android | ใช่ | ไม่ได้ | ไม่ได้ | ใช่ |
ความสามารถของเอฟเฟกต์ Android | ไม่ | ไม่ได้ | ใช่ | ไม่ |
การส่งเอฟเฟกต์ Android | ใช่ | ไม่ได้ | ไม่ได้ | ไม่ |
คิวบัฟเฟอร์แบบง่ายของ Android | ใช่: แหล่งที่มา (การเล่น) หรือที่กักเก็บ (การถอดรหัส) | ใช่ | ไม่ได้ | ไม่ |
ตัวระบุตำแหน่งข้อมูลคิวบัฟเฟอร์ของ Android | ใช่: ต้นทาง (ถอดรหัส) | ไม่ | ไม่ได้ | ไม่ |
ตัวระบุตำแหน่งข้อมูลข้อบ่งชี้ไฟล์ Android | ใช่: แหล่งที่มา | ไม่ | ไม่ได้ | ไม่ |
ตัวระบุตำแหน่งข้อมูลคิวบัฟเฟอร์อย่างง่ายของ Android | ใช่: แหล่งที่มา (การเล่น) หรือที่เก็บ (การถอดรหัส) | ใช่: อ่างล้างหน้า | ไม่ | ไม่ |
อินเทอร์เฟซการกําหนดค่า Android
อินเทอร์เฟซการกําหนดค่า Android มีวิธีตั้งค่าพารามิเตอร์เฉพาะแพลตฟอร์มสําหรับออบเจ็กต์ อินเทอร์เฟซนี้แตกต่างจากอินเทอร์เฟซอื่นๆ ของ OpenSL ES 1.0.1 ตรงที่แอปของคุณสามารถใช้อินเทอร์เฟซนี้ก่อนที่จะสร้างอินสแตนซ์ของออบเจ็กต์ที่เกี่ยวข้องได้ คุณจึงกำหนดค่าออบเจ็กต์ก่อนที่จะสร้างอินสแตนซ์ได้ ไฟล์ส่วนหัว OpenSLES_AndroidConfiguration.h
ซึ่งอยู่ใน /sysroot/usr/include/SLES
จะบันทึกคีย์และค่าการกําหนดค่าที่ใช้ได้ดังต่อไปนี้
- ประเภทสตรีมสำหรับโปรแกรมเล่นเสียง (ค่าเริ่มต้น
SL_ANDROID_STREAM_MEDIA
) - บันทึกโปรไฟล์สำหรับโปรแกรมอัดเสียง (ค่าเริ่มต้น
SL_ANDROID_RECORDING_PRESET_GENERIC
)
ข้อมูลโค้ดต่อไปนี้จะแสดงตัวอย่างวิธีตั้งค่าประเภทสตรีมเสียง Android ในเสียง ผู้เล่น:
// CreateAudioPlayer and specify SL_IID_ANDROIDCONFIGURATION // in the required interface ID array. Do not realize player yet. // ... SLAndroidConfigurationItf playerConfig; result = (*playerObject)->GetInterface(playerObject, SL_IID_ANDROIDCONFIGURATION, &playerConfig); assert(SL_RESULT_SUCCESS == result); SLint32 streamType = SL_ANDROID_STREAM_ALARM; result = (*playerConfig)->SetConfiguration(playerConfig, SL_ANDROID_KEY_STREAM_TYPE, &streamType, sizeof(SLint32)); assert(SL_RESULT_SUCCESS == result); // ... // Now realize the player here.
คุณใช้โค้ดที่คล้ายกันเพื่อกำหนดค่าที่กำหนดล่วงหน้าสำหรับเครื่องบันทึกเสียงได้ ดังนี้
// ... obtain the configuration interface as the first four lines above, then: SLuint32 presetValue = SL_ANDROID_RECORDING_PRESET_VOICE_RECOGNITION; result = (*playerConfig)->SetConfiguration(playerConfig, RECORDING_PRESET, &presetValue, sizeof(SLuint32));
อินเทอร์เฟซเอฟเฟกต์ Android
อินเทอร์เฟซความสามารถในการสร้างเอฟเฟกต์ การส่งเอฟเฟกต์ และเอฟเฟกต์ของ Android กลไกทั่วไปสำหรับแอปพลิเคชันในการค้นหาและใช้งานเฉพาะอุปกรณ์ เอฟเฟกต์เสียง ผู้ผลิตอุปกรณ์ควรบันทึกเอฟเฟกต์เสียงเฉพาะอุปกรณ์ที่พร้อมใช้งานซึ่งตนมีให้
แอปพลิเคชันแบบพกพาควรใช้ OpenSL ES 1.0.1 API สำหรับเอฟเฟกต์เสียงแทนส่วนขยายเอฟเฟกต์ของ Android
ตัวระบุตำแหน่งข้อมูลข้อบ่งชี้ไฟล์ Android
ตัวระบุตำแหน่งข้อมูลตัวระบุไฟล์ Android ช่วยให้คุณระบุแหล่งที่มาของโปรแกรมเล่นเสียงเป็นตัวระบุไฟล์แบบเปิดที่มีสิทธิ์อ่านได้ รูปแบบข้อมูลต้องเป็น MIME
ส่วนขยายนี้มีประโยชน์เป็นพิเศษเมื่อใช้ร่วมกับระบบจัดการเนื้อหาเนทีฟเนื่องจาก แอปอ่านเนื้อหาจาก APK ผ่านข้อบ่งชี้ไฟล์
ตัวระบุและอินเทอร์เฟซข้อมูลคิวบัฟเฟอร์แบบง่ายของ Android
ในข้อกำหนดอ้างอิง OpenSL ES 1.0.1 สามารถใช้คิวบัฟเฟอร์สำหรับโปรแกรมเล่นเสียงเท่านั้น และเข้ากันได้กับ PCM และรูปแบบข้อมูลอื่นๆ ข้อกำหนดเฉพาะของอินเทอร์เฟซและตัวระบุข้อมูลคิวบัฟเฟอร์แบบง่ายของ Android จะเหมือนกับข้อกำหนดอ้างอิง โดยมีข้อยกเว้น 2 ข้อดังนี้
- คุณใช้คิวบัฟเฟอร์แบบง่ายของ Android กับเครื่องบันทึกเสียงและโปรแกรมเล่นเสียงได้
- คุณสามารถใช้รูปแบบข้อมูล PCM กับคิวเหล่านี้เท่านั้น
สำหรับการบันทึก แอปควรจัดคิวบัฟเฟอร์ว่าง เมื่อมีการส่ง Callback ที่ลงทะเบียนไว้ การแจ้งเตือนว่าระบบเขียนข้อมูลลงในบัฟเฟอร์เสร็จแล้ว แอปก็จะสามารถ ที่อ่านจากบัฟเฟอร์นั้น
การเล่นจะทำงานในลักษณะเดียวกัน อย่างไรก็ตาม เราขอแนะนำให้แอปพลิเคชันใช้คิวบัฟเฟอร์แบบง่ายของ Android แทนคิวบัฟเฟอร์ OpenSL ES 1.0.1 เพื่อให้โค้ดต้นฉบับเข้ากันได้ในอนาคต
ลักษณะการทำงานของคิวบัฟเฟอร์
การใช้งาน Android ไม่รวมถึง
ข้อกำหนดการอ้างอิงให้เคอร์เซอร์เล่นกลับไปที่จุดเริ่มต้น
ของบัฟเฟอร์ที่เล่นอยู่ในปัจจุบันเมื่อเล่นเข้าสู่ SL_PLAYSTATE_STOPPED
การใช้งานนี้สามารถเป็นไปตามลักษณะการทำงานดังกล่าว หรือจะปล่อยตำแหน่งเคอร์เซอร์การเล่นไว้เหมือนเดิมก็ได้
ด้วยเหตุนี้ แอปของคุณจึงคาดเดาไม่ได้ว่าจะมีลักษณะการทำงานอย่างใดอย่างหนึ่งเกิดขึ้น ดังนั้น
คุณควรเรียกใช้เมธอด BufferQueue::Clear()
อย่างชัดแจ้งหลังจากเปลี่ยนไปใช้
SL_PLAYSTATE_STOPPED
การทำเช่นนี้จะตั้งค่าคิวบัฟเฟอร์เป็นสถานะที่รู้จัก
ในทํานองเดียวกัน ไม่มีข้อกําหนดว่าทริกเกอร์สําหรับการเรียกกลับคิวบัฟเฟอร์ต้องเป็นการเปลี่ยนไปใช้ SL_PLAYSTATE_STOPPED
หรือการเรียกใช้ BufferQueue::Clear()
ดังนั้น เราขอแนะนำให้คุณอย่าสร้างการอ้างอิงกับ
อย่างใดอย่างหนึ่ง แต่แอปของคุณควรจะจัดการทั้ง 2 อย่างได้
อินเทอร์เฟซแบบไดนามิกเมื่อสร้างออบเจ็กต์
การใช้งาน OpenSL ES 1.0.1 ของ Android อนุญาตให้แอประบุอินเทอร์เฟซแบบไดนามิกเมื่อสร้างอินสแตนซ์ออบเจ็กต์เพื่อความสะดวก
วิธีนี้เป็นทางเลือกในการใช้ DynamicInterfaceManagement::AddInterface()
เพื่อเพิ่มอินเทอร์เฟซเหล่านี้หลังจากการสร้างอินสแตนซ์
การรายงานชิ้นงาน
การตรวจสอบว่าแพลตฟอร์มรองรับส่วนขยาย Android หรือไม่มี 3 วิธี วิธีการเหล่านี้ได้แก่
Engine::QueryNumSupportedExtensions()
Engine::QuerySupportedExtension()
Engine::IsExtensionSupported()
เมธอดเหล่านี้แสดงผล ANDROID_SDK_LEVEL_<API-level>
,
โดยที่ API-level
คือระดับ API ของแพลตฟอร์ม ตัวอย่างเช่น ANDROID_SDK_LEVEL_23
API แพลตฟอร์มระดับ 9 ขึ้นไปหมายความว่าแพลตฟอร์มรองรับส่วนขยาย
ถอดรหัสเสียงเป็น PCM
ส่วนนี้จะอธิบายส่วนขยายเฉพาะสำหรับ Android ที่เลิกใช้งานแล้วสำหรับ OpenSL ES 1.0.1 สำหรับการถอดรหัสสตรีมที่เข้ารหัสเป็น PCM โดยไม่ต้องเล่นทันที ตารางด้านล่างแสดงคําแนะนําในการใช้ส่วนขยายนี้และทางเลือกอื่นๆ
ระดับ API | ทางเลือก |
---|---|
15 ปีหรือต่ำกว่า | ตัวแปลงรหัสแบบโอเพนซอร์สที่มีใบอนุญาตที่เหมาะสม |
16 ถึง 20 |
คลาส MediaCodec หรือตัวแปลงรหัสโอเพนซอร์สที่มีใบอนุญาตที่เหมาะสม
|
21 ปีขึ้นไป |
NDK MediaCodec ในไฟล์ส่วนหัว <media/NdkMedia*.h> ฟิลด์
MediaCodec หรือตัวแปลงรหัสโอเพนซอร์สที่มีใบอนุญาตที่เหมาะสม
|
หมายเหตุ:
ปัจจุบันยังไม่มีเอกสารประกอบเกี่ยวกับเวอร์ชัน NDK ของ MediaCodec
API อย่างไรก็ตาม คุณดูตัวอย่างโค้ด
native-codec ได้
โปรแกรมเล่นเสียงมาตรฐานจะเล่นไปยังอุปกรณ์เสียง โดยระบุการมิกซ์เอาต์พุตเป็นซิงก์ข้อมูล ส่วนขยาย Android แตกต่างจากโปรแกรมเล่นเสียง ทำหน้าที่เป็นตัวถอดรหัส หากแอประบุแหล่งข้อมูลเป็น URI หรือเป็น Android ตัวระบุตำแหน่งข้อมูลข้อบ่งชี้ไฟล์ที่อธิบายโดยใช้รูปแบบข้อมูล MIME ในกรณีเช่นนี้ ข้อมูลลงในอุปกรณ์คือตัวระบุข้อมูลคิวบัฟเฟอร์แบบง่ายของ Android ที่ใช้รูปแบบข้อมูล PCM
ฟีเจอร์นี้มีไว้สําหรับเกมให้โหลดเนื้อหาเสียงไว้ล่วงหน้าเมื่อเปลี่ยนเป็น
ระดับเกมใหม่ ซึ่งคล้ายกับฟังก์ชันที่ SoundPool
ที่เรามีให้
ในตอนแรก แอปพลิเคชันควรเป็นชุดบัฟเฟอร์ว่างใน Android Simple คิวบัฟเฟอร์ หลังจากนั้น แอปจะนำข้อมูล PCM ไปใส่ในบัฟเฟอร์ Android แบบง่าย Callback ของคิวบัฟเฟอร์เริ่มทำงานหลังจากที่บัฟเฟอร์แต่ละรายการได้รับการเติมข้อมูลแล้ว ประมวลผลตัวแฮนเดิล Callback ข้อมูล PCM จัดคิวบัฟเฟอร์ที่ว่างอยู่อีกครั้ง แล้วส่งกลับ แอปพลิเคชันนี้มีหน้าที่ ติดตามบัฟเฟอร์ที่ถอดรหัสแล้ว รายการพารามิเตอร์ Callback ไม่รวม ข้อมูลที่เพียงพอเพื่อระบุบัฟเฟอร์ที่มีข้อมูลหรือบัฟเฟอร์ที่ควรอยู่ อยู่ในคิวถัดไป
แหล่งข้อมูลจะรายงานการสิ้นสุดสตรีม (EOS) โดยนัยด้วยการส่งเหตุการณ์ SL_PLAYEVENT_HEADATEND
ที่ตอนท้ายของสตรีม หลังจากแอปถอดรหัสข้อมูลทั้งหมดที่ได้รับแล้ว จะไม่เรียกใช้การเรียกกลับคิวบัฟเฟอร์แบบง่ายของ Android อีก
โดยทั่วไป รูปแบบข้อมูล PCM ของที่เก็บข้อมูลจะตรงกับรูปแบบของแหล่งข้อมูลที่เข้ารหัสในแง่ของอัตราตัวอย่าง จํานวนช่อง และบิตความลึก อย่างไรก็ตาม คุณสามารถถอดรหัสเป็น อัตราการสุ่มตัวอย่าง จำนวนช่อง หรือความลึกของบิต ดูข้อมูลเกี่ยวกับข้อกำหนดในการตรวจหารูปแบบ PCM จริงได้ที่ กำหนดรูปแบบของข้อมูลที่ถอดรหัส PCM ผ่านข้อมูลเมตา
ฟีเจอร์การถอดรหัส PCM ของ OpenSL ES สำหรับ Android รองรับการหยุดชั่วคราวและการกรอไปข้างหน้าครั้งแรก แต่ไม่รองรับการควบคุมระดับเสียง เอฟเฟกต์ การเล่นซ้ำ หรืออัตราการเล่น
การถอดรหัสอาจต้องใช้ทรัพยากรที่ไม่สามารถปล่อยว่างไว้ได้ ทั้งนี้ขึ้นอยู่กับการใช้งานแพลตฟอร์ม ดังนั้น เราขอแนะนำให้คุณจัดเตรียมบัฟเฟอร์ PCM ว่างไว้ให้เพียงพอ ไม่เช่นนั้นโปรแกรมถอดรหัสจะไม่มีข้อมูลเพียงพอ ซึ่งอาจเกิดขึ้น ตัวอย่างเช่น หากแอปของคุณส่งคืนจากการเรียกกลับของคิวบัฟเฟอร์อย่างง่ายของ Android โดยไม่มี กำลังจัดคิวบัฟเฟอร์ว่างอื่นอยู่ ผลลัพธ์ของการไม่มีพื้นที่ว่างสำหรับตัวถอดรหัสนั้นไม่ระบุไว้ แต่อาจรวมถึงการทิ้งข้อมูล PCM ที่ถอดรหัสแล้ว หยุดกระบวนการถอดรหัสชั่วคราว หรือสิ้นสุดการทำงานของตัวถอดรหัสไปเลย
หมายเหตุ:
เพื่อถอดรหัสสตรีมที่เข้ารหัสไปยัง PCM แต่ไม่ให้เล่นทันทีสำหรับแอปที่ทำงานบน
Android 4.x (API ระดับ 16-20) เราขอแนะนําให้ใช้คลาส MediaCodec
สําหรับแอปพลิเคชันใหม่ที่ทํางานบน Android 5.0 (API ระดับ 21) ขึ้นไป เราขอแนะนําให้ใช้ <NdkMedia*.h>
ซึ่งเป็น NDK ที่เทียบเท่า ไฟล์ส่วนหัวเหล่านี้อยู่ใน
ไดเรกทอรี media/
ภายใต้รูทของการติดตั้ง
ถอดรหัสสตรีมมิง ADTS AAC ไปยัง PCM
โปรแกรมเล่นเสียงทำหน้าที่เป็นตัวถอดรหัสสตรีมมิงหากแหล่งข้อมูลเป็น ตัวระบุตำแหน่งข้อมูลคิวบัฟเฟอร์ของ Android ที่ใช้รูปแบบข้อมูล MIME และข้อมูล Sink เป็นตัวระบุตำแหน่งข้อมูลคิวบัฟเฟอร์อย่างง่ายของ Android ที่ใช้รูปแบบข้อมูล PCM กำหนดค่ารูปแบบข้อมูล MIME ดังนี้
- คอนเทนเนอร์:
SL_CONTAINERTYPE_RAW
- สตริงประเภท MIME:
SL_ANDROID_MIME_AACADTS
ฟีเจอร์นี้มีจุดประสงค์หลักสำหรับการสตรีมแอปพลิเคชันสื่อที่ จัดการเสียง AAC แต่ต้องดำเนินการประมวลผลเสียงที่กำหนดเอง ก่อนที่จะเล่น แอปพลิเคชันส่วนใหญ่ที่ต้องถอดรหัสเสียงเป็น PCM ควรใช้วิธีที่อธิบายไว้ในถอดรหัสเสียงเป็น PCM เนื่องจากวิธีนั้นง่ายกว่าและจัดการกับรูปแบบเสียงได้มากกว่า เทคนิคที่อธิบายไว้ที่นี่เป็นแนวทางเฉพาะทางมากขึ้น ซึ่งจะใช้ได้ก็ต่อเมื่อเป็นไปตามเงื่อนไขทั้ง 2 ข้อต่อไปนี้
- แหล่งที่มาของเสียงที่บีบอัดเป็นสตรีมเฟรม AAC ที่มีอยู่ในส่วนหัว ADTS
- แอปพลิเคชันจัดการสตรีมนี้ ข้อมูลไม่ได้อยู่ภายใน ทรัพยากรเครือข่ายที่มีตัวระบุเป็น URI หรือภายในไฟล์ในเครื่องที่มีตัวระบุ ข้อบ่งชี้ไฟล์
ในระยะแรก แอปพลิเคชันควรจัดคิวชุดบัฟเฟอร์ที่เต็มแล้วไว้ในคิวบัฟเฟอร์ของ Android บัฟเฟอร์แต่ละรายการมีเฟรม ADTS AAC ที่สมบูรณ์อย่างน้อย 1 รายการ Callback ของคิวบัฟเฟอร์ Android เริ่มทำงานหลังจากที่ล้างบัฟเฟอร์แต่ละรายการแล้ว ตัวแฮนเดิล Callback ควรเติมไฟและจัดคิวบัฟเฟอร์ใหม่ จากนั้นค่อยกลับมา แอปพลิเคชันไม่จำเป็นต้องติดตามบัฟเฟอร์ที่เข้ารหัส พารามิเตอร์ Callback รายการมีข้อมูลเพียงพอที่จะระบุบัฟเฟอร์ที่ควรจัดคิวถัดไป จุดสิ้นสุดของสตรีมมีการทำเครื่องหมายอย่างชัดแจ้งโดยการจัดคิวรายการ EOS หลังจาก EOS ไม่อนุญาตให้เพิ่มคิวอีก
เราขอแนะนําให้คุณระบุ บัฟเฟอร์ AAC ของ ADTS เพื่อหลีกเลี่ยงการทำให้ตัวถอดรหัสทำงานไม่เต็ม กรณีนี้อาจเกิดขึ้นได้ เช่น หากแอปของคุณกลับมาจากการเรียกกลับคิวบัฟเฟอร์ของ Android โดยไม่จัดคิวบัฟเฟอร์ที่เต็มอีกรายการ ไม่ได้ระบุผลของการอดไฟล์ตัวถอดรหัส
วิธีการถอดรหัสของสตรีมมิงจะเหมือนกับวิธีการถอดรหัสของสตรีม ในทุกๆ ด้าน ยกเว้นแหล่งข้อมูล คำอธิบายที่ถอดรหัสเสียงเป็น PCM
แม้ว่าชื่อจะคล้ายกัน แต่คิวบัฟเฟอร์ของ Android ไม่เหมือนกับคิวบัฟเฟอร์แบบง่ายของ Android ตัวถอดรหัสสตรีมมิงใช้คิวบัฟเฟอร์ทั้ง 2 ประเภท ได้แก่ คิวบัฟเฟอร์ Android สำหรับแหล่งข้อมูล ADTS AAC และคิวบัฟเฟอร์แบบง่ายของ Android สำหรับที่เก็บข้อมูล PCM ดูข้อมูลเพิ่มเติมเกี่ยวกับ API ของคิวบัฟเฟอร์แบบง่ายของ Android ได้ที่ตัวระบุและอินเทอร์เฟซข้อมูลคิวบัฟเฟอร์แบบง่ายของ Android
ดูข้อมูลเพิ่มเติมเกี่ยวกับ API คิวบัฟเฟอร์ของ Android ได้ที่ไฟล์ index.html
ในไดเรกทอรี docs/Additional_library_docs/openmaxal/
ใต้รูทการติดตั้ง
กำหนดรูปแบบของข้อมูลที่ถอดรหัส PCM ผ่านข้อมูลเมตา
อินเทอร์เฟซ SLMetadataExtractionItf
เป็นส่วนหนึ่งของข้อกำหนดการอ้างอิง
อย่างไรก็ตาม คีย์ข้อมูลเมตาที่ระบุรูปแบบจริงของข้อมูล PCM ที่ถอดรหัสแล้วจะเป็นข้อมูลเฉพาะสำหรับ
Android ไฟล์ส่วนหัว OpenSLES_AndroidMetadata.h
กำหนดคีย์ข้อมูลเมตาเหล่านี้
ไฟล์ส่วนหัวนี้อยู่ในรูทของการติดตั้งในส่วน
ไดเรกทอรี /sysroot/usr/include/SLES
ดัชนีคีย์ข้อมูลเมตาจะพร้อมใช้งานทันทีหลังจากเมธอด Object::Realize()
ดำเนินการเสร็จสิ้น แต่ค่าที่เชื่อมโยง
ใช้ได้จนกว่าแอปจะถอดรหัสข้อมูลแรกที่เข้ารหัส ระดับพอดี
มีแนวทางปฏิบัติคือการค้นหาดัชนีคีย์ในเทรดหลักหลังจากเรียกใช้เมธอด Object::Realize
และอ่านค่าข้อมูลเมตาของรูปแบบ PCM ใน Android แบบง่าย
ตัวแฮนเดิล Callback ของคิวบัฟเฟอร์เมื่อเรียกใช้เป็นครั้งแรก ดูตัวอย่างการใช้งานอินเทอร์เฟซนี้ได้จากโค้ดตัวอย่างในแพ็กเกจ NDK
ชื่อคีย์ข้อมูลเมตาจะคงที่ แต่ดัชนีคีย์จะไม่มีเอกสารประกอบและอาจมีการเปลี่ยนแปลง แอปพลิเคชันไม่ควรถือว่าดัชนี คงอยู่ตลอดระหว่างการเรียกใช้การดำเนินการต่างๆ และไม่ควรสรุปว่า อินสแตนซ์ออบเจ็กต์หลายรายการจะใช้ดัชนีภายในการเรียกใช้เดียวกัน
ข้อมูลจุดลอยตัว
แอปที่ทำงานบน Android 5.0 (API ระดับ 21) ขึ้นไปสามารถให้ข้อมูลแก่ AudioPlayer ได้ใน รูปแบบจุดลอยตัวที่มีค่าความแม่นยําเดียว
ในโค้ดตัวอย่างต่อไปนี้ เมธอด Engine::CreateAudioPlayer()
จะสร้างโปรแกรมเล่นเสียงที่ใช้ข้อมูลทศนิยม
#include <SLES/OpenSLES_Android.h> ... SLAndroidDataFormat_PCM_EX pcm; pcm.formatType = SL_ANDROID_DATAFORMAT_PCM_EX; pcm.numChannels = 2; pcm.sampleRate = SL_SAMPLINGRATE_44_1; pcm.bitsPerSample = 32; pcm.containerSize = 32; pcm.channelMask = SL_SPEAKER_FRONT_LEFT | SL_SPEAKER_FRONT_RIGHT; pcm.endianness = SL_BYTEORDER_LITTLEENDIAN; pcm.representation = SL_ANDROID_PCM_REPRESENTATION_FLOAT; ... SLDataSource audiosrc; audiosrc.pLocator = ... audiosrc.pFormat = &pcm;