ส่วนขยาย Android

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 กลไกทั่วไปสำหรับแอปพลิเคชันในการค้นหาและใช้งานเฉพาะอุปกรณ์ เอฟเฟกต์เสียง ผู้ผลิตอุปกรณ์ควรบันทึกเอฟเฟกต์เสียงสำหรับอุปกรณ์ที่มีโดยเฉพาะ ที่พวกเขามอบให้

แอปพลิเคชันแบบพกพาควรใช้ API ของ OpenSL ES 1.0.1 สำหรับเอฟเฟกต์เสียงแทน Android ของส่วนขยาย

ตัวระบุตำแหน่งข้อมูลข้อบ่งชี้ไฟล์ Android

คุณสามารถใช้ตัวระบุตำแหน่งข้อมูลตัวระบุไฟล์ Android เพื่อระบุตำแหน่งสำหรับ โปรแกรมเล่นเสียงเป็นข้อบ่งชี้ไฟล์แบบเปิดพร้อมสิทธิ์การอ่าน รูปแบบข้อมูลต้องเป็น MIME

ส่วนขยายนี้มีประโยชน์เป็นพิเศษเมื่อใช้ร่วมกับระบบจัดการเนื้อหาเนทีฟเนื่องจาก แอปอ่านเนื้อหาจาก APK ผ่านข้อบ่งชี้ไฟล์

ตัวระบุตำแหน่งและอินเทอร์เฟซข้อมูลคิวบัฟเฟอร์อย่างง่ายของ Android

ในข้อกำหนดอ้างอิง OpenSL ES 1.0.1 คิวบัฟเฟอร์สามารถใช้กับโปรแกรมเล่นเสียงเท่านั้น และ ใช้ได้กับ PCM และรูปแบบข้อมูลอื่นๆ ข้อกำหนดตัวระบุตัวระบุตำแหน่งและข้อมูลอินเทอร์เฟซอย่างง่ายของ Android คือ เหมือนกับข้อกำหนดข้อมูลอ้างอิง โดยมีข้อยกเว้น 2 ประการ ได้แก่

  • คุณสามารถใช้คิวบัฟเฟอร์อย่างง่ายของ Android กับโปรแกรมอัดเสียงและโปรแกรมเล่นเสียงได้
  • คุณสามารถใช้รูปแบบข้อมูล PCM กับคิวเหล่านี้เท่านั้น

สำหรับการบันทึก แอปควรเป็นคิวของบัฟเฟอร์ว่าง เมื่อมีการส่ง Callback ที่ลงทะเบียนไว้ การแจ้งเตือนว่าระบบเขียนข้อมูลลงในบัฟเฟอร์เสร็จแล้ว แอปก็จะสามารถ ที่อ่านจากบัฟเฟอร์นั้น

โดยการเล่นจะทำงานในลักษณะเดียวกัน สำหรับซอร์สโค้ดในอนาคต ความเข้ากันได้ แต่เราขอแนะนำให้แอปพลิเคชันต่างๆ ใช้ Android Simple คิวบัฟเฟอร์แทนคิวบัฟเฟอร์ OpenSL ES 1.0.1

ลักษณะการทำงานของคิวบัฟเฟอร์

การใช้งาน Android ไม่รวมถึง ข้อกำหนดการอ้างอิงให้เคอร์เซอร์เล่นกลับไปที่จุดเริ่มต้น ของบัฟเฟอร์ที่เล่นอยู่ในปัจจุบันเมื่อเล่นเข้าสู่ SL_PLAYSTATE_STOPPED การใช้งานนี้อาจสอดคล้องกับลักษณะการทำงานดังกล่าว หรืออาจออกจากตำแหน่งที่เล่น เคอร์เซอร์ไม่เปลี่ยนแปลง ด้วยเหตุนี้ แอปของคุณจึงคาดเดาไม่ได้ว่าจะมีลักษณะการทำงานอย่างใดอย่างหนึ่งเกิดขึ้น ดังนั้น คุณควรเรียกใช้เมธอด BufferQueue::Clear() อย่างชัดแจ้งหลังจากเปลี่ยนไปใช้ SL_PLAYSTATE_STOPPED การทำเช่นนี้จะตั้งค่าคิวบัฟเฟอร์เป็นสถานะที่รู้จัก

ในทำนองเดียวกัน ไม่มีข้อกำหนดที่กำหนดว่าทริกเกอร์สำหรับ Callback ของคิวบัฟเฟอร์จะต้อง การเปลี่ยนไปใช้ 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 ที่ถอดรหัสแล้วผ่านข้อมูลเมตา

OpenSL ES สำหรับฟีเจอร์การถอดรหัส PCM ของ Android รองรับการหยุดชั่วคราวและกรอเริ่มต้น ไม่รองรับ ตัวควบคุมระดับเสียง เอฟเฟกต์ การวนซ้ำ หรืออัตราการเล่น

การถอดรหัสอาจต้องใช้ทรัพยากร ทั้งนี้ขึ้นอยู่กับการใช้งานแพลตฟอร์ม ที่ไม่สามารถปล่อยให้ไม่มีการใช้งานได้ ดังนั้น จึงขอแนะนำให้คุณระบุ บัฟเฟอร์ PCM ที่ว่างเปล่าในจำนวนที่เพียงพอ ไม่เช่นนั้น ตัวถอดรหัสจะเลิก ซึ่งอาจเกิดขึ้น ตัวอย่างเช่น หากแอปของคุณส่งคืนจากการเรียกกลับของคิวบัฟเฟอร์อย่างง่ายของ Android โดยไม่มี กำลังจัดคิวบัฟเฟอร์ว่างอื่นอยู่ ผลลัพธ์ของความอดอยากของตัวถอดรหัสคือ ไม่ได้ระบุ แต่อาจรวมถึงการลบไฟล์ที่ถอดรหัสแล้ว ข้อมูล PCM, หยุดกระบวนการถอดรหัสชั่วคราว หรือยุติโปรแกรมถอดรหัสทันที

หมายเหตุ: เพื่อถอดรหัสสตรีมที่เข้ารหัสไปยัง PCM แต่ไม่ให้เล่นทันทีสำหรับแอปที่ทำงานบน Android 4.x (API ระดับ 16-20) เราขอแนะนําให้ใช้คลาส MediaCodec สำหรับแอปพลิเคชันใหม่ที่ทำงานบน Android 5.0 (API ระดับ 21) ขึ้นไป เราขอแนะนำให้ใช้ NDK เทียบเท่า <NdkMedia*.h> ไฟล์ส่วนหัวเหล่านี้อยู่ใน ไดเรกทอรี 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;
อ่านเพิ่มเติมเกี่ยวกับเสียงแบบจุดลอยตัว ในหน้าการสุ่มตัวอย่างเสียง