หน้านี้มีรายละเอียดเกี่ยวกับวิธี การนำ OpenSL มาใช้ NDK ESTM แตกต่างจากข้อกำหนดอ้างอิงสำหรับ OpenSL ES 1.0.1 เมื่อใช้โค้ดตัวอย่างจาก คุณอาจต้องแก้ไขเพื่อให้ใช้งานได้กับ Android
ฟีเจอร์ทั้งหมดมีให้บริการใน Android 2.3 (API ระดับ 9) ขึ้นไป เว้นแต่จะระบุไว้เป็นอย่างอื่น ฟีเจอร์บางอย่างใช้ได้เฉพาะใน Android 4.0 (API ระดับ 14) ไว้
หมายเหตุ: เอกสารข้อกำหนดความเข้ากันได้ของ Android (CDD) จะแจกแจงฮาร์ดแวร์และซอฟต์แวร์ ข้อกำหนดของอุปกรณ์ Android ที่ใช้งานร่วมกันได้ โปรดดู ความเข้ากันได้กับ Android สำหรับข้อมูลเพิ่มเติมเกี่ยวกับโปรแกรมความเข้ากันได้โดยรวม และ CDD สำหรับเอกสาร CDD จริง
OpenSL ES ต้องมี C อินเทอร์เฟซภาษาที่สามารถเข้าถึงได้โดยใช้ C++ โดยมีฟีเจอร์ที่คล้ายกับเสียง บางส่วนของ Android Java API เหล่านี้ ได้แก่
เช่นเดียวกับ Android Native Development Kit (NDK) ทั้งหมด วัตถุประสงค์หลักของ OpenSL ES เพื่อ Android มีส่วนช่วยในการเรียกไลบรารีที่ใช้ร่วมกันให้เรียกโดยใช้ Java Native อินเทอร์เฟซ (JNI ) NDK ไม่ได้มีไว้เพื่อเขียนแอปพลิเคชัน C/C++ เท่านั้น อย่างไรก็ตาม OpenSL ES เป็น API ที่มีฟีเจอร์ครบถ้วน และเราคาดหวังว่าคุณควรจะสามารถตอบสนองความต้องการด้านเสียงส่วนใหญ่ของคุณได้ โดยใช้เพียง API นี้ โดยไม่มีการเรียกโค้ดที่ทำงานในรันไทม์ของ Android
หมายเหตุ: แม้ว่า OpenSL ES แต่ API เสียง (เสียงประสิทธิภาพสูง) ใน Android นั้นไม่ใช่ การปฏิบัติตามโปรไฟล์ OpenSL ES 1.0.1 (เกม เพลง หรือโทรศัพท์) นั่นเป็นเพราะ Android ไม่ได้ใช้ฟีเจอร์ทั้งหมดที่โปรไฟล์ใดโปรไฟล์หนึ่งจำเป็นต้องใช้ กรณีใดๆ ที่ทราบ เมื่อ Android ทำงานต่างจากข้อมูลจำเพาะที่ได้อธิบายไว้ใน ส่วนขยาย Android
ฟีเจอร์ที่รับช่วงมาจากข้อกำหนดข้อมูลอ้างอิง
การติดตั้งใช้งาน OpenSL ES สำหรับ Android NDK นำเอาชุดฟีเจอร์ส่วนใหญ่มาจาก ข้อกำหนดการอ้างอิง โดยมีข้อจำกัดบางประการ
จุดแรกเข้าทั่วโลก
OpenSL ES สำหรับ Android รองรับจุดแรกเข้าทั่วโลกตามข้อกำหนดของ Android จุดแรกเข้าเหล่านี้ประกอบด้วย
slCreateEngine
slQueryNumSupportedEngineInterfaces
slQuerySupportedEngineInterfaces
ออบเจ็กต์และอินเทอร์เฟซ
ตารางต่อไปนี้แสดงออบเจ็กต์และอินเทอร์เฟซที่การติดตั้งใช้งาน Android NDK รองรับ OpenSL ES ถ้าใช่ปรากฏในเซลล์ แสดงว่าฟีเจอร์นั้นมีอยู่ใน การใช้งานของคุณ
ฟีเจอร์ | โปรแกรมเล่นเสียง | โปรแกรมบันทึกเสียง | เครื่องยนต์ | มิกซ์เอาต์พุต |
---|---|---|---|---|
เพิ่มเสียงเบส | ใช่ | ไม่ได้ | ไม่ได้ | ใช่ |
คิวบัฟเฟอร์ | ใช่ | ไม่ได้ | ไม่ได้ | ไม่ |
ตัวระบุตำแหน่งข้อมูลคิวบัฟเฟอร์ | ใช่: แหล่งที่มา | ไม่ | ไม่ได้ | ไม่ |
การจัดการอินเทอร์เฟซแบบไดนามิก | ใช่ | ได้ | ได้ | ใช่ |
ส่งเอฟเฟกต์ | ใช่ | ไม่ได้ | ไม่ได้ | ไม่ |
เครื่องยนต์ | ไม่ | ไม่ได้ | ใช่ | ไม่ |
เสียงก้องสภาพแวดล้อม | ไม่ | ไม่ได้ | ไม่ได้ | ใช่ |
อีควอไลเซอร์ | ใช่ | ไม่ได้ | ไม่ได้ | ใช่ |
ตัวระบุตำแหน่งข้อมูลอุปกรณ์ I/O | ไม่ | ใช่: แหล่งที่มา | ไม่ | ไม่ |
การดึงข้อมูลข้อมูลเมตา | ใช่: ถอดรหัสเป็น PCM | ไม่ | ไม่ได้ | ไม่ |
ปิดเสียงคนเดียว | ใช่ | ไม่ได้ | ไม่ได้ | ไม่ |
วัตถุ | ใช่ | ได้ | ได้ | ใช่ |
ตัวระบุตำแหน่งมิกซ์เอาต์พุต | ใช่: ซิงก์ | ไม่ | ไม่ได้ | ไม่ |
เล่น | ใช่ | ไม่ได้ | ไม่ได้ | ไม่ |
อัตราการเล่น | ใช่ | ไม่ได้ | ไม่ได้ | ไม่ |
สถานะการดึงข้อมูลล่วงหน้า | ใช่ | ไม่ได้ | ไม่ได้ | ไม่ |
เสียงก้องที่ตั้งล่วงหน้า | ไม่ | ไม่ได้ | ไม่ได้ | ใช่ |
บันทึก | ไม่ | ใช่ | ไม่ได้ | ไม่ |
ค้นหา | ใช่ | ไม่ได้ | ไม่ได้ | ไม่ |
ตัวระบุตำแหน่งข้อมูล URI | ใช่: แหล่งที่มา | ไม่ | ไม่ได้ | ไม่ |
เวอร์ชวลไลเซอร์ | ใช่ | ไม่ได้ | ไม่ได้ | ใช่ |
ระดับเสียง | ใช่ | ไม่ได้ | ไม่ได้ | ไม่ |
ส่วนถัดไปจะอธิบายข้อจำกัดของฟีเจอร์เหล่านี้
ข้อจำกัด
ฟีเจอร์ในตารางที่ 1 มีข้อจำกัดบางประการ ข้อจำกัดเหล่านี้ แสดงถึงความแตกต่างจากข้อกำหนดอ้างอิง เนื้อหาที่เหลือของส่วนนี้ ข้อมูลเกี่ยวกับความแตกต่างเหล่านี้
การจัดการอินเทอร์เฟซแบบไดนามิก
OpenSL ES สำหรับ Android ไม่รองรับ RemoveInterface
หรือ
ResumeInterface
การรวมเอฟเฟกต์: Reverb สภาพแวดล้อมและ Reverb ที่กำหนดล่วงหน้า
คุณไม่สามารถมีทั้ง Reverb สภาพแวดล้อมและ Reverb ที่กำหนดล่วงหน้าในมิกซ์เอาต์พุตเดียวกัน
แพลตฟอร์มอาจไม่สนใจคำขอเอฟเฟกต์หากมีการประมาณว่า ภาระงานของ CPU จะสูงเกินไป
ส่งเอฟเฟกต์
SetSendLevel()
รองรับระดับการส่งเดียวต่อโปรแกรมเล่นเสียง
เสียงก้องสภาพแวดล้อม
Reverb สภาพแวดล้อมไม่รองรับ reflectionsDelay
reflectionsLevel
หรือ reverbDelay
ฟิลด์ของ
โครงสร้าง SLEnvironmentalReverbSettings
รูปแบบข้อมูล MIME
คุณสามารถใช้รูปแบบข้อมูล MIME ได้เฉพาะกับตัวระบุตำแหน่งข้อมูล URI และสำหรับเสียงเท่านั้น โปรแกรมเล่นวิดีโอ คุณไม่สามารถใช้รูปแบบข้อมูลนี้สำหรับโปรแกรมอัดเสียง
คุณต้องเริ่มต้น mimeType
ก่อนจึงจะใช้งาน OpenSL ES ได้สำหรับ Android
NULL
หรือสตริง UTF-8 ที่ถูกต้อง คุณต้องเริ่มต้น
containerType
เป็นค่าที่ถูกต้อง
ในกรณีที่ไม่มีข้อควรพิจารณาอื่นๆ เช่น ความสามารถในการย้ายไปยัง
การใช้งานหรือรูปแบบเนื้อหาที่แอประบุด้วยส่วนหัวไม่ได้
เราขอแนะนำให้คุณ
ตั้งค่า mimeType
เป็น NULL
และ containerType
ไปยัง SL_CONTAINERTYPE_UNSPECIFIED
OpenSL ES สำหรับ Android สนับสนุนรูปแบบเสียงต่อไปนี้ ตราบใดที่ นอกจากนี้ แพลตฟอร์ม Android ยังรองรับฟีเจอร์เหล่านี้ด้วย
- WAV PCM
- มาตรฐาน WAV
- ว่าไงนะ
- MP3 Ogg Vorbis
- AAC LC
- HE-AACv1 (AAC+)
- HE-AACv2 (AAC ที่ปรับปรุงใหม่)
- AMR
- FLAC
หมายเหตุ: สำหรับรายการรูปแบบเสียงที่ Android สนับสนุน โปรดดู รูปแบบสื่อที่รองรับ
การจัดการวิดีโอเหล่านี้และรูปแบบอื่นๆ ใน การใช้งาน OpenSL ES:
- AAC รูปแบบต้องอยู่ในคอนเทนเนอร์ MP4 หรือ ADTS
- OpenSL ES สำหรับ Android ไม่รองรับ MIDI
- WMA ไม่ได้เป็นส่วนหนึ่งของ AOSP และเรา ยังไม่ได้ยืนยันความเข้ากันได้กับ OpenSL ES สำหรับ Android
- การใช้ OpenSL ES สำหรับ Android NDK ไม่สนับสนุนการเข้าชมโดยตรง การเล่น DRM หรือเนื้อหาที่เข้ารหัส หากต้องการเล่นเนื้อหาเสียงที่ได้รับการคุ้มครอง คุณต้องทำดังนี้ ถอดรหัสในแอปพลิเคชันของคุณก่อนเล่น โดยแอปของคุณบังคับใช้ DRM ข้อจำกัด
วิธีการที่เกี่ยวข้องกับออบเจ็กต์
OpenSL ES สำหรับ Android ไม่รองรับวิธีการต่อไปนี้ในการจัดการออบเจ็กต์
Resume()
RegisterCallback()
AbortAsyncOperation()
SetPriority()
GetPriority()
SetLossOfControlInterfaces()
รูปแบบข้อมูล PCM
PCM เป็นรูปแบบข้อมูลเดียวที่คุณใช้กับคิวบัฟเฟอร์ได้ PCM ที่รองรับ การกำหนดค่าการเล่นมีลักษณะดังต่อไปนี้
- ไม่มีลายเซ็น 8 บิต หรือแบบมีลายเซ็น 16 บิต
- โมโนหรือสเตอริโอ
- การจัดลำดับไบต์ของ Little-endian
- อัตราการสุ่มตัวอย่าง:
- 8,000 Hz
- 11,025 Hz
- 12,000 Hz
- 16,000 Hz
- 22,050 Hz
- 24,000 Hz
- 32,000 Hz
- 44,100 Hz
- 48,000 Hz
การกำหนดค่าที่ OpenSL ES สำหรับ Android รองรับสำหรับการบันทึกมีดังนี้ ขึ้นอยู่กับอุปกรณ์ โดยปกติจะมีสัญญาณโมโน/16 บิตแบบ 16,000 Hz จะมีให้บริการไม่ว่าจะใช้อุปกรณ์ใด
ค่าของช่อง samplesPerSec
มีหน่วยเป็นมิลลิวินาที แม้จะมีข้อมูลที่ทำให้เข้าใจผิด
ชื่อ เพื่อหลีกเลี่ยงการใช้ค่าที่ไม่ถูกต้องโดยไม่ได้ตั้งใจ เราขอแนะนำให้คุณเริ่มต้นฟิลด์นี้โดยใช้
หนึ่งในค่าคงที่เชิงสัญลักษณ์ที่กำหนดไว้สำหรับวัตถุประสงค์นี้ เช่น SL_SAMPLINGRATE_44_1
การรองรับ Android 5.0 (API ระดับ 21) ขึ้นไป ข้อมูลจุดลอยตัว
อัตราการเล่น
อัตราการเล่น OpenSL ES แสดงถึงความเร็วที่ นำเสนอข้อมูลซึ่งแสดงด้วยความเร็วปกตินับพันหรือต่อการแสดงผล 1,000 ครั้ง ตัวอย่างเช่น อัตราการเล่น 1,000 ครั้งต่อการแสดงผล 1,000 ครั้งคือ 1,000/1, 000 หรือความเร็วปกติ ช่วงอัตรา คือช่วงเวลาปิดซึ่งแสดงช่วงอัตราการเล่นที่เป็นไปได้
การรองรับช่วงอัตราการเล่นและความสามารถอื่นๆ อาจแตกต่างกันออกไป
เกี่ยวกับเวอร์ชันแพลตฟอร์มและการใช้งาน แอปของคุณจะกำหนดความสามารถเหล่านี้ขณะรันไทม์ได้โดย
โดยใช้ PlaybackRate::GetRateRange()
หรือ
PlaybackRate::GetCapabilitiesOfRate()
เพื่อค้นหาอุปกรณ์
โดยทั่วไปอุปกรณ์รองรับช่วงอัตราเดียวกันสำหรับแหล่งข้อมูลในรูปแบบ PCM และอัตราความเป็นหนึ่งเดียวกัน 1,000 ต่อ 1,000 ถึง 1,000 ต่อ 1,000 สำหรับรูปแบบอื่นๆ นั่นคือช่วงอัตราความสามัคคีคือ เพียงค่าเดียวที่มีประสิทธิภาพ
บันทึก
OpenSL ES สำหรับ Android ไม่รองรับ SL_RECORDEVENT_HEADATLIMIT
หรือ SL_RECORDEVENT_HEADMOVING
กิจกรรม
ค้นหา
เมธอด SetLoop()
เปิดใช้การวนซ้ำทั้งไฟล์ หากต้องการเปิดใช้การวนซ้ำ
ตั้งค่าพารามิเตอร์ startPos
เป็น 0 และพารามิเตอร์ endPos
ไปยัง SL_TIME_UNKNOWN
ตัวระบุตำแหน่งข้อมูลคิวบัฟเฟอร์
โปรแกรมเล่นหรือเครื่องบันทึกเสียงที่มีตัวระบุตำแหน่งข้อมูลสำหรับคิวบัฟเฟอร์รองรับรูปแบบข้อมูล PCM เท่านั้น
ตัวระบุตำแหน่งข้อมูลอุปกรณ์ I/O
OpenSL ES สำหรับ Android รองรับการใช้ตัวระบุตำแหน่งข้อมูลอุปกรณ์ I/O เฉพาะเมื่อคุณมี
ระบุตัวระบุตำแหน่งเป็นแหล่งข้อมูลสำหรับ Engine::CreateAudioRecorder()
เริ่มต้นตัวระบุตำแหน่งข้อมูลอุปกรณ์โดยใช้ค่าที่มีอยู่ในข้อมูลโค้ดต่อไปนี้
SLDataLocator_IODevice loc_dev = {SL_DATALOCATOR_IODEVICE, SL_IODEVICE_AUDIOINPUT, SL_DEFAULTDEVICEID_AUDIOINPUT, NULL};
ตัวระบุตำแหน่งข้อมูล URI
OpenSL ES สำหรับ Android สามารถใช้เครื่องระบุตำแหน่งข้อมูล URI ที่มีรูปแบบข้อมูล MIME เท่านั้น
และสำหรับโปรแกรมเล่นเสียงเท่านั้น คุณใช้ตัวระบุข้อมูล URI สำหรับโปรแกรมอัดเสียงไม่ได้ URI ใช้ได้เฉพาะ
ใช้รูปแบบ http:
และ file:
รูปแบบอื่นๆ เช่น https:
ftp:
หรือ
ไม่อนุญาตให้ใช้ content:
เรายังไม่ยืนยันการรองรับ rtsp:
ที่มีเสียงบนแพลตฟอร์ม Android
โครงสร้างข้อมูล
Android รองรับโครงสร้างข้อมูล OpenSL ES 1.0.1 ดังต่อไปนี้
SLDataFormat_MIME
SLDataFormat_PCM
SLDataLocator_BufferQueue
SLDataLocator_IODevice
SLDataLocator_OutputMix
SLDataLocator_URI
SLDataSink
SLDataSource
SLEngineOption
SLEnvironmentalReverbSettings
SLInterfaceID
การกำหนดค่าแพลตฟอร์ม
OpenSL ES for Android ได้รับการออกแบบมาสำหรับแอปพลิเคชันแบบหลายชุดข้อความและเหมาะสำหรับเทรด รองรับ เครื่องมือเดี่ยวต่อแอปพลิเคชัน และมีออบเจ็กต์ได้สูงสุด 32 ออบเจ็กต์ต่อเครื่องมือ หน่วยความจำและ CPU ของอุปกรณ์ที่ใช้งานได้อาจ จำกัดจำนวนออบเจ็กต์ที่ใช้ได้
ระบบจะรู้จักตัวเลือกเครื่องมือค้นหาเหล่านี้ แต่ slCreateEngine
จะไม่สนใจตัวเลือกดังกล่าว:
SL_ENGINEOPTION_THREADSAFE
SL_ENGINEOPTION_LOSSOFCONTROL
OpenMAX AL และ OpenSL ES สามารถใช้ร่วมกันในแอปพลิเคชันเดียวกันได้ ในกรณีนี้ มี ออบเจ็กต์เครื่องมือที่ใช้ร่วมกันรายการเดียวภายใน และมีการแชร์ขีดจำกัดออบเจ็กต์ที่ 32 ระหว่าง OpenMAX AL และ OpenSL ES แอปพลิเคชันควรสร้างเครื่องมือทั้งสอง ใช้เครื่องมือทั้งสอง และสุดท้าย ทำลายเครื่องมือทั้งสอง การใช้งานจะรักษาจำนวนการอ้างอิงในเครื่องมือที่แชร์ไว้เพื่อให้ แท็กจะถูกทำลายอย่างถูกต้องในระหว่างการดำเนินการทำลายครั้งที่สอง
หมายเหตุการจัดโปรแกรม
หมายเหตุเกี่ยวกับการเขียนโปรแกรม OpenSL ES ให้ข้อมูลเสริมเพื่อให้แน่ใจว่ามีการใช้งาน OpenSL ES อย่างเหมาะสม
หมายเหตุ:
เพื่อความสะดวกของคุณ เราได้รวมสำเนาของข้อกำหนด OpenSL ES 1.0.1 พร้อม NDK ไว้ใน
docs/opensles/OpenSL_ES_Specification_1.0.1.pdf
ปัญหาเกี่ยวกับแพลตฟอร์ม
ส่วนนี้จะอธิบายปัญหาที่ทราบของแพลตฟอร์มรุ่นแรกที่รองรับ API เหล่านี้
การจัดการอินเทอร์เฟซแบบไดนามิก
DynamicInterfaceManagement::AddInterface
ไม่ทำงาน แต่ให้ระบุอินเทอร์เฟซใน
อาร์เรย์ที่ส่งไปยัง Create()
ดังที่แสดงในโค้ดตัวอย่าง Reverb สภาพแวดล้อม
วางแผนสำหรับ OpenSL ES เวอร์ชันในอนาคต
API เสียงประสิทธิภาพสูงของ Android นั้นอิงตาม Khronos Group OpenSL ES 1.0.1 Khronos ได้เผยแพร่มาตรฐานเวอร์ชัน 1.1 ที่แก้ไขแล้ว ฉบับแก้ไขประกอบด้วยฟีเจอร์ใหม่ การชี้แจง การแก้ไขข้อผิดพลาดในการพิมพ์ และ บางอย่างเข้ากันไม่ได้ ความไม่เข้ากันที่คาดไว้ส่วนใหญ่จะอยู่ในระดับที่น้อยมากหรืออยู่ใน พื้นที่ของ OpenSL ES ที่ไม่รองรับโดย Android
แอปพลิเคชัน ที่พัฒนาด้วยเวอร์ชันนี้ควรใช้งานได้บนแพลตฟอร์ม Android เวอร์ชันต่อๆ ไป หาก คุณต้องปฏิบัติตามหลักเกณฑ์ที่ระบุไว้ในแผนสำหรับไบนารี ความเข้ากันได้ที่ด้านล่าง
หมายเหตุ: ความเข้ากันได้กับแหล่งที่มาในอนาคตไม่ใช่เป้าหมาย กล่าวคือ หากคุณอัปเกรดเป็น NDK เวอร์ชันที่ใหม่กว่า คุณอาจต้องแก้ไขซอร์สโค้ดของแอปพลิเคชันของคุณให้สอดคล้องกับ API ใหม่ เราคาดว่า การเปลี่ยนแปลงดังกล่าวจะมีเพียงเล็กน้อย โปรดดูรายละเอียดด้านล่าง
วางแผนความเข้ากันได้กับไบนารี
เราขอแนะนำให้แอปพลิเคชันของคุณปฏิบัติตามหลักเกณฑ์เหล่านี้เพื่อปรับปรุงความเข้ากันได้ของไบนารีในอนาคต
- ใช้เฉพาะชุดย่อยของฟีเจอร์ที่รองรับ Android จาก OpenSL ES 1.0.1
- อย่าอ้างอิงรหัสผลลัพธ์บางรายการสำหรับการดำเนินการที่ไม่สำเร็จ เตรียมตัวรับมือกับ ด้วยรหัสผลลัพธ์อื่น
- โดยทั่วไปตัวแฮนเดิล Callback ของแอปพลิเคชันจะทำงานในบริบทที่มีการจำกัด ควรเขียน ทำงานให้เสร็จอย่างรวดเร็ว แล้วกลับมาใหม่โดยเร็วที่สุด อย่าเรียกใช้การดำเนินการที่ซับซ้อน ภายในเครื่องจัดการ Callback ตัวอย่างเช่น ภายในการเรียกกลับการเสร็จสิ้นคิวบัฟเฟอร์ คุณสามารถ จัดคิวบัฟเฟอร์อื่น แต่อย่าสร้างโปรแกรมเล่นเสียง
- ตัวแฮนเดิล Callback ควรเตรียมให้มีการเรียกบ่อยขึ้นหรือน้อยลงเพื่อรับ ประเภทเหตุการณ์เพิ่มเติม และควรละเว้นประเภทเหตุการณ์ที่ไม่รู้จัก Callback ที่ มีการกำหนดค่าด้วยมาสก์เหตุการณ์ที่สร้างขึ้นจากประเภทเหตุการณ์ที่เปิดใช้ ซึ่งควรเตรียมพร้อมที่จะเรียกใช้ ที่มีการตั้งค่าบิตเหตุการณ์หลายประเภทพร้อมกัน ใช้ "&" เพื่อทดสอบแต่ละบิตของเหตุการณ์ เคสสวิตช์
- ใช้สถานะการดึงข้อมูลล่วงหน้าและการเรียกกลับเป็นสัญญาณทั่วไปเกี่ยวกับความคืบหน้า แต่ต้องไม่ขึ้นอยู่กับ ระดับการเติมเต็มหรือลำดับการเรียกกลับที่เฉพาะเจาะจง ความหมายของการเติมสถานะการดึงข้อมูลล่วงหน้า และลักษณะการทำงานสำหรับข้อผิดพลาดที่ตรวจพบระหว่างการดึงข้อมูลล่วงหน้าอาจเปลี่ยนแปลงได้
หมายเหตุ: ดู ลักษณะการทำงานของคิวบัฟเฟอร์ ด้านล่างเพื่อดูรายละเอียดเพิ่มเติม
แผนสำหรับความเข้ากันได้ของแหล่งที่มา
ดังที่กล่าวไปแล้ว ความไม่เข้ากันของซอร์สโค้ดเป็นสิ่งที่คาดว่าจะเกิดขึ้นใน OpenSL ES เวอร์ชันถัดไป Khronos Group สิ่งที่น่าจะทำให้เกิดการเปลี่ยนแปลงมีดังนี้
- อินเทอร์เฟซคิวบัฟเฟอร์น่าจะมีการเปลี่ยนแปลงที่สำคัญ โดยเฉพาะในพื้นที่
ของ
BufferQueue::Enqueue
รายการพารามิเตอร์สำหรับslBufferQueueCallback
และ ชื่อฟิลด์SLBufferQueueState.playIndex
เราขอแนะนำให้ใช้โค้ดของแอปพลิเคชัน คิวบัฟเฟอร์อย่างง่ายของ Android แทน ในตัวอย่าง โค้ดที่มาพร้อมกับ NDK เราได้ใช้คิวบัฟเฟอร์อย่างง่ายของ Android สำหรับการเล่น ด้วยเหตุผลนี้ (เรายังใช้คิวบัฟเฟอร์อย่างง่ายของ Android สำหรับบันทึกและถอดรหัสไปยัง PCM ด้วย แต่ เนื่องจาก OpenSL ES 1.0.1 มาตรฐานไม่รองรับการบันทึกหรือถอดรหัสไปยังข้อมูลคิวบัฟเฟอร์ ซิงก์) - จะมีการเพิ่ม
const
ลงในพารามิเตอร์อินพุตที่ส่งผ่านโดยการอ้างอิง และ ฟิลด์โครงสร้างSLchar *
ที่ใช้เป็นค่าอินพุต ไม่จำเป็นต้องทำการเปลี่ยนแปลงใดๆ โค้ดของคุณ - จะมีการแทนที่ประเภทที่ไม่ได้ลงนามสำหรับพารามิเตอร์บางรายการที่มีการรับรองอยู่ในขณะนี้
คุณอาจต้องเปลี่ยนประเภทพารามิเตอร์จาก
SLint32
เป็นSLuint32
หรือที่คล้ายกัน หรือ เพิ่มนักแสดง Equalizer::GetPresetName
จะคัดลอกสตริงไปยังหน่วยความจำของแอปพลิเคชันแทนที่จะส่งคืน ตัวชี้ไปยังหน่วยความจำการใช้งาน นี่เป็นการเปลี่ยนแปลงที่สำคัญ เราจึงขอแนะนำให้คุณ หลีกเลี่ยงการเรียกใช้วิธีนี้ หรือแยกการใช้งานของคุณ- จะมีช่องอื่นๆ อีกในประเภทโครงสร้าง สำหรับพารามิเตอร์เอาต์พุต ช่องใหม่เหล่านี้ แต่สำหรับพารามิเตอร์อินพุต ฟิลด์ใหม่จะต้องเริ่มต้น โชคดี ช่องทั้งหมดนี้อยู่ในพื้นที่ที่ Android ไม่รองรับ
- อินเทอร์เฟซ GUID จะเปลี่ยนแปลง โปรดดูอินเทอร์เฟซตามชื่อสัญลักษณ์ แทน GUID เพื่อหลีกเลี่ยง การพึ่งพา
SLchar
จะเปลี่ยนจากunsigned char
เป็นchar
ซึ่งหลักๆ แล้ว ตัวระบุตำแหน่งข้อมูล URI และรูปแบบข้อมูล MIMESLDataFormat_MIME.mimeType
จะเปลี่ยนชื่อเป็นpMimeType
และSLDataLocator_URI.URI
จะเปลี่ยนชื่อเป็นpURI
เราขอแนะนำให้คุณเริ่มต้น โครงสร้างข้อมูลSLDataFormat_MIME
และSLDataLocator_URI
โดยใช้ รายการที่คั่นด้วยเครื่องหมายคอมมาและคั่นค่าด้วยเครื่องหมายจุลภาค แทนที่จะเป็นชื่อช่อง เพื่อแยกโค้ดของคุณ ออกจากการเปลี่ยนแปลงนี้ เราใช้เทคนิคนี้ในโค้ดตัวอย่างSL_DATAFORMAT_PCM
ไม่อนุญาตให้แอปพลิเคชันระบุตัวแทนของ ข้อมูลเป็นจำนวนเต็มแบบมีเครื่องหมาย จำนวนเต็มที่ไม่มีเครื่องหมาย หรือจุดทศนิยม การใช้งาน Android จะถือว่าข้อมูล 8 บิตเป็นจํานวนเต็มที่ไม่มีเครื่องหมาย และ 16 บิตคือจํานวนเต็มที่มีเครื่องหมาย นอกจากนี้ ฟิลด์samplesPerSec
เป็นชื่อที่ผิดเพี้ยนไปเนื่องจากหน่วยจริงเป็นมิลลิวินาที ปัญหาเหล่านี้เป็นเรื่องปกติ ใน OpenSL ES เวอร์ชันถัดไป ซึ่งจะเริ่มใช้ข้อมูล PCM แบบขยายใหม่ ที่อนุญาตให้แอปพลิเคชันระบุการเป็นตัวแทนอย่างชัดเจนและแก้ไข ชื่อช่อง เนื่องจากนี่เป็นรูปแบบข้อมูลใหม่ และข้อมูล PCM ในปัจจุบันจะยังคง ใช้งานได้ (แม้จะเลิกใช้งานแล้ว) คุณจึงไม่จำเป็นต้องเปลี่ยนแปลงโค้ดโดยทันที