ส่วนขยาย Android

คำเตือน: 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;
อ่านข้อมูลเพิ่มเติมเกี่ยวกับเสียงแบบจุดลอยในหน้าการสุ่มตัวอย่างเสียง