คำเตือน: OpenSL ES เลิกใช้งานแล้ว นักพัฒนาซอฟต์แวร์ควรใช้ไลบรารี Oboe แบบโอเพนซอร์สซึ่งมีอยู่ใน GitHub โอโบเป็น Wrapper ของ C++ ที่มี API คล้ายกับ AAudio โอโบจะเรียก AAudio เมื่อ AAudio สามารถใช้ได้ และจะกลับไปใช้ OpenSL ES ในกรณีที่ AAudio ไม่พร้อมใช้งาน
หน้านี้จะให้รายละเอียดเกี่ยวกับความแตกต่างระหว่างการใช้งาน OpenSL ES™ ใน NDK กับข้อกำหนดอ้างอิงสำหรับ 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++ ด้วย โดยจะแสดงฟีเจอร์ที่คล้ายกับส่วนเสียงของ API Java ของ Android ต่อไปนี้
เช่นเดียวกับ Android Native Development Kit (NDK) ทั้งหมด วัตถุประสงค์หลักของ OpenSL ES สำหรับ Android คือเพื่ออำนวยความสะดวกในการใช้งานไลบรารีที่แชร์ซึ่งจะเรียกใช้โดยใช้ Java Native Interface (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
วัตถุและอินเทอร์เฟซ
ตารางต่อไปนี้แสดงออบเจ็กต์และอินเทอร์เฟซที่การใช้งาน OpenSL ES ของ Android NDK รองรับ หากมีคำว่า Yes ปรากฏในเซลล์ แสดงว่าฟีเจอร์พร้อมใช้งานในการใช้งานนี้
ฟีเจอร์ | โปรแกรมเล่นเสียง | โปรแกรมบันทึกเสียง | เครื่องยนต์ | ส่วนผสมของเอาต์พุต |
---|---|---|---|---|
เพิ่มเสียงเบส | ใช่ | ไม่ได้ | ไม่ได้ | ใช่ |
คิวบัฟเฟอร์ | ใช่ | ไม่ได้ | ไม่ได้ | ไม่ |
ตัวระบุตำแหน่งข้อมูลคิวบัฟเฟอร์ | ใช่: แหล่งที่มา | ไม่ | ไม่ได้ | ไม่ |
การจัดการอินเทอร์เฟซแบบไดนามิก | ใช่ | ได้ | ได้ | ใช่ |
ส่งเอฟเฟกต์ | ใช่ | ไม่ได้ | ไม่ได้ | ไม่ |
เครื่องยนต์ | ไม่ | ไม่ได้ | ใช่ | ไม่ |
Reverb สภาพแวดล้อม | ไม่ | ไม่ได้ | ไม่ได้ | ใช่ |
อีควอไลเซอร์ | ใช่ | ไม่ได้ | ไม่ได้ | ใช่ |
ตัวระบุตำแหน่งข้อมูลอุปกรณ์ I/O | ไม่ | ใช่: แหล่งที่มา | ไม่ | ไม่ |
การดึงข้อมูลเมตา | ใช่: ถอดรหัสเป็น PCM | ไม่ | ไม่ได้ | ไม่ |
ปิดเสียงโซโล | ใช่ | ไม่ได้ | ไม่ได้ | ไม่ |
วัตถุ | ใช่ | ได้ | ได้ | ใช่ |
ตัวระบุตำแหน่งมิกซ์เอาต์พุต | ใช่: อ่างล้างหน้า | ไม่ | ไม่ได้ | ไม่ |
เล่น | ใช่ | ไม่ได้ | ไม่ได้ | ไม่ |
อัตราการเล่น | ใช่ | ไม่ได้ | ไม่ได้ | ไม่ |
สถานะการดึงข้อมูลล่วงหน้า | ใช่ | ไม่ได้ | ไม่ได้ | ไม่ |
เสียงก้องที่ตั้งล่วงหน้า | ไม่ | ไม่ได้ | ไม่ได้ | ใช่ |
บันทึก | ไม่ | ใช่ | ไม่ได้ | ไม่ |
ค้นหา | ใช่ | ไม่ได้ | ไม่ได้ | ไม่ |
ตัวระบุตำแหน่งข้อมูล URI | ใช่: แหล่งที่มา | ไม่ | ไม่ได้ | ไม่ |
เวอร์ชวลไลเซอร์ | ใช่ | ไม่ได้ | ไม่ได้ | ใช่ |
ระดับเสียง | ใช่ | ไม่ได้ | ไม่ได้ | ไม่ |
ส่วนถัดไปจะอธิบายข้อจํากัดของฟีเจอร์บางอย่างเหล่านี้
ข้อจำกัด
ฟีเจอร์ในตารางที่ 1 มีข้อจํากัดบางประการ ข้อจำกัดเหล่านี้แสดงถึงความแตกต่างจากข้อกำหนดอ้างอิง ส่วนที่เหลือของส่วนนี้จะให้ข้อมูลเกี่ยวกับความแตกต่างเหล่านี้
การจัดการอินเทอร์เฟซแบบไดนามิก
OpenSL ES สำหรับ Android ไม่รองรับ RemoveInterface
หรือ
ResumeInterface
การรวมเอฟเฟกต์: Reverb สภาพแวดล้อมและ Reverb ที่กำหนดล่วงหน้า
คุณไม่สามารถใช้ทั้งเสียงสะท้อนจากสภาพแวดล้อมและเสียงสะท้อนที่กำหนดล่วงหน้าในมิกซ์เอาต์พุตเดียวกัน
แพลตฟอร์มอาจไม่สนใจคำขอเอฟเฟกต์หากคาดว่าการโหลด CPU จะสูงเกินไป
ส่งเอฟเฟกต์
SetSendLevel()
รองรับระดับการส่งระดับเดียวต่อโปรแกรมเล่นเสียง
Reverb สภาพแวดล้อม
Reverb สภาพแวดล้อมไม่รองรับฟิลด์ reflectionsDelay
,
reflectionsLevel
หรือ reverbDelay
ของ SLEnvironmentalReverbSettings
รูปแบบข้อมูล MIME
คุณสามารถใช้รูปแบบข้อมูล MIME ได้เฉพาะกับตัวระบุตำแหน่งข้อมูล URI และกับโปรแกรมเล่นเสียงเท่านั้น คุณใช้รูปแบบข้อมูลนี้กับเครื่องบันทึกเสียงไม่ได้
หากต้องการใช้ OpenSL ES สำหรับ Android คุณต้องเริ่มต้น mimeType
เป็น NULL
หรือสตริง UTF-8 ที่ถูกต้อง นอกจากนี้ คุณยังต้องเริ่มต้นค่า containerType
เป็นค่าที่ถูกต้องด้วย
หากไม่มีข้อพิจารณาอื่นๆ เช่น ความสามารถในการย้ายไปยังการใช้งานรูปแบบอื่นๆ หรือรูปแบบเนื้อหาที่แอประบุด้วยส่วนหัวไม่ได้ เราขอแนะนำให้คุณตั้งค่า mimeType
เป็น NULL
และ containerType
เป็น SL_CONTAINERTYPE_UNSPECIFIED
OpenSL ES สำหรับ Android รองรับรูปแบบเสียงต่อไปนี้ ตราบใดที่แพลตฟอร์ม Android รองรับรูปแบบดังกล่าวด้วย
- WAV PCM
- รูปแบบ WAV
- WAV ulaw
- 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,000 Hz โมโน/16 บิตแบบลงนามจะใช้ได้กับทุกอุปกรณ์
ค่าของช่อง samplesPerSec
มีหน่วยเป็นมิลลิวินาที แม้จะมีชื่อที่ทำให้เข้าใจผิด เราขอแนะนําให้คุณเริ่มต้นค่านี้โดยใช้ค่าคงที่เชิงสัญลักษณ์ที่กําหนดไว้สําหรับวัตถุประสงค์นี้ เช่น SL_SAMPLINGRATE_44_1
เพื่อหลีกเลี่ยงการใช้ค่าที่ไม่ถูกต้องโดยไม่ตั้งใจ
Android 5.0 (API ระดับ 21) ขึ้นไปรองรับข้อมูลทศนิยม
อัตราการเล่น
อัตราการเล่นของ OpenSL ES บ่งบอกถึงความเร็วที่ออบเจ็กต์แสดงข้อมูล ซึ่งแสดงเป็นพันของความเร็วปกติหรือต่อพัน เช่น อัตราการเล่น 1,000 ต่อ 1,000 คือ 1,000/1,000 หรือความเร็วปกติ ช่วงอัตราคือช่วงเวลาที่ปิดซึ่งแสดงช่วงของอัตราการเล่นที่เป็นไปได้
การรองรับช่วงอัตราการเล่นและความสามารถอื่นๆ อาจแตกต่างกันไปตามเวอร์ชันของแพลตฟอร์มและการใช้งาน แอปสามารถระบุความสามารถเหล่านี้ได้เมื่อรันไทม์โดยใช้ PlaybackRate::GetRateRange()
หรือ PlaybackRate::GetCapabilitiesOfRate()
เพื่อค้นหาอุปกรณ์
โดยทั่วไป อุปกรณ์จะรองรับช่วงอัตราเดียวกันสำหรับแหล่งข้อมูลในรูปแบบ PCM และช่วงอัตราส่วน 1, 000 ต่อ 1, 000 สำหรับรูปแบบอื่นๆ กล่าวคือ ช่วงอัตราส่วน 1:1 มีค่าเดียว
บันทึก
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 สำหรับ Android ออกแบบมาสำหรับแอปพลิเคชันแบบหลายเธรดและเป็นแบบเธรดเซฟ โดยรองรับเครื่องยนต์ 1 เครื่องต่อแอปพลิเคชันและออบเจ็กต์สูงสุด 32 รายการต่อเครื่องยนต์ หน่วยความจำและ CPU ของอุปกรณ์ที่ใช้ได้อาจจำกัดจำนวนออบเจ็กต์ที่ใช้ได้เพิ่มเติม
slCreateEngine
จะจดจำตัวเลือกเครื่องมือค้นหาต่อไปนี้ แต่จะละเว้น
SL_ENGINEOPTION_THREADSAFE
SL_ENGINEOPTION_LOSSOFCONTROL
คุณใช้ OpenMAX AL และ OpenSL ES ร่วมกันในแอปพลิเคชันเดียวกันได้ ในกรณีนี้ จะมีออบเจ็กต์เครื่องยนต์ที่แชร์เพียงรายการเดียวภายใน และขีดจำกัดออบเจ็กต์ 32 รายการจะแชร์กันระหว่าง OpenMAX AL และ OpenSL ES แอปพลิเคชันควรสร้างทั้ง 2 โปรแกรม ใช้ทั้ง 2 โปรแกรม และสุดท้ายก็ทำลายทั้ง 2 โปรแกรม การใช้งานจะเก็บจํานวนการอ้างอิงในเครื่องมือที่แชร์ไว้เพื่อให้ระบบทำลายเครื่องมือได้อย่างถูกต้องในระหว่างการดำเนินการทำลายครั้งที่ 2
หมายเหตุการเขียนโปรแกรม
หมายเหตุการเขียนโปรแกรม 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 เช่น ภายในการเรียกกลับเมื่อคิวบัฟเฟอร์เสร็จสมบูรณ์ คุณสามารถจัดคิวบัฟเฟอร์อื่นได้ แต่ไม่สร้างโปรแกรมเล่นเสียง
- แฮนเดิลการเรียกกลับควรเตรียมพร้อมที่จะเรียกใช้บ่อยหรือน้อย เพื่อรับประเภทเหตุการณ์เพิ่มเติม และควรละเว้นประเภทเหตุการณ์ที่ไม่รู้จัก แบ็กคอลที่กําหนดค่าด้วยมาสก์เหตุการณ์ที่สร้างขึ้นจากประเภทเหตุการณ์ที่เปิดใช้ควรเตรียมพร้อมที่จะเรียกใช้โดยมีการกําหนดบิตประเภทเหตุการณ์หลายรายการพร้อมกัน ใช้ "&" เพื่อทดสอบแต่ละบิตเหตุการณ์แทนที่จะใช้สวิตช์เคส
- ใช้สถานะการอ่านล่วงหน้าและการเรียกกลับเพื่อบ่งบอกความคืบหน้าโดยทั่วไป แต่อย่าขึ้นอยู่กับระดับการบรรจุหรือลําดับการเรียกกลับที่เขียนมาอย่างเจาะจง ความหมายของระดับการกรอกสถานะการเรียกข้อมูลล่วงหน้าและลักษณะการทํางานของข้อผิดพลาดที่ตรวจพบระหว่างการเรียกข้อมูลล่วงหน้าอาจเปลี่ยนแปลงได้
หมายเหตุ: ดูรายละเอียดเพิ่มเติมได้ที่ส่วนลักษณะการทำงานของคิวบัฟเฟอร์ด้านล่าง
วางแผนสําหรับความเข้ากันได้ของแหล่งที่มา
ดังที่ได้กล่าวไว้ก่อนหน้านี้ คาดว่า OpenSL ES เวอร์ชันถัดไปจากกลุ่ม Khronos จะใช้งานซอร์สโค้ดร่วมกันไม่ได้ สิ่งที่มีแนวโน้มจะเปลี่ยนแปลงมีดังนี้
- อินเทอร์เฟซคิวบัฟเฟอร์คาดว่าจะมีการเปลี่ยนแปลงที่สำคัญ โดยเฉพาะในส่วน
BufferQueue::Enqueue
, รายการพารามิเตอร์สําหรับslBufferQueueCallback
และชื่อช่องSLBufferQueueState.playIndex
เราขอแนะนำให้โค้ดของแอปพลิเคชันใช้คิวบัฟเฟอร์อย่างง่ายของ Android แทน ในตัวอย่างโค้ดที่มาพร้อมกับ NDK เราใช้คิวบัฟเฟอร์แบบง่ายของ Android สำหรับการเล่นด้วยเหตุผลนี้ (เรายังใช้คิวบัฟเฟอร์แบบง่ายของ Android สำหรับการบันทึกและการถอดรหัสเป็น PCM ด้วย แต่นั่นเป็นเพราะ OpenSL ES 1.0.1 มาตรฐานไม่รองรับการบันทึกหรือถอดรหัสไปยังซิงค์ข้อมูลคิวบัฟเฟอร์) - ระบบจะเพิ่ม
const
ลงในพารามิเตอร์อินพุตที่ส่งผ่านโดยการอ้างอิง และSLchar *
ลงในช่อง Struct ที่ใช้เป็นค่าอินพุต ซึ่งไม่ควรจำเป็นต้องเปลี่ยนแปลงโค้ดใดๆ ทั้งสิ้น - ระบบจะแทนที่ประเภทที่ไม่มีการรับรองสําหรับพารามิเตอร์บางรายการที่ตอนนี้มีการรับรอง
คุณอาจต้องเปลี่ยนประเภทพารามิเตอร์จาก
SLint32
เป็นSLuint32
หรือที่คล้ายกัน หรือเพิ่มแคสต์ Equalizer::GetPresetName
จะคัดลอกสตริงไปยังหน่วยความจำแอปพลิเคชันแทนที่จะแสดงผลพอยน์เตอร์ไปยังหน่วยความจำของการใช้งาน การเปลี่ยนแปลงนี้จะส่งผลอย่างมาก เราจึงขอแนะนำให้คุณหลีกเลี่ยงการเรียกใช้เมธอดนี้หรือแยกการใช้งาน- จะมีช่องเพิ่มเติมในประเภทโครงสร้าง สําหรับพารามิเตอร์เอาต์พุต คุณสามารถละเว้นช่องใหม่เหล่านี้ได้ แต่สําหรับพารามิเตอร์อินพุต จะต้องเริ่มต้นช่องใหม่ แต่โชคดีที่คาดว่าช่องเหล่านี้ทั้งหมดจะอยู่ในพื้นที่ที่ Android ไม่รองรับ
- GUID ของอินเทอร์เฟซจะเปลี่ยนแปลง อ้างอิงอินเทอร์เฟซด้วยชื่อสัญลักษณ์แทน GUID เพื่อหลีกเลี่ยงการพึ่งพา
SLchar
จะเปลี่ยนราคาจากunsigned char
เป็นchar
ซึ่งส่งผลต่อตัวระบุข้อมูล URI และรูปแบบข้อมูล MIME เป็นหลักSLDataFormat_MIME.mimeType
จะเปลี่ยนชื่อเป็นpMimeType
และSLDataLocator_URI.URI
จะเปลี่ยนชื่อเป็นpURI
เราขอแนะนําให้คุณเริ่มต้นใช้งานโครงสร้างข้อมูลSLDataFormat_MIME
และSLDataLocator_URI
โดยใช้รายการค่าที่คั่นด้วยคอมมาและปิดด้วยวงเล็บปีกกา แทนที่จะใช้ชื่อช่อง เพื่อแยกโค้ดของคุณออกจากการเปลี่ยนแปลงนี้ มีการใช้เทคนิคนี้ในโค้ดตัวอย่างSL_DATAFORMAT_PCM
ไม่อนุญาตให้แอปพลิเคชันระบุการแสดงข้อมูลเป็นจำนวนเต็มแบบมีเครื่องหมาย จำนวนเต็มที่ไม่มีเครื่องหมาย หรือจุดทศนิยม การใช้งาน Android จะถือว่าข้อมูล 8 บิตเป็นจํานวนเต็มแบบไม่ระบุเครื่องหมาย และ 16 บิตเป็นจํานวนเต็มแบบระบุเครื่องหมาย นอกจากนี้ ฟิลด์samplesPerSec
ยังมีชื่อไม่ถูกต้อง เนื่องจากหน่วยจริงคือมิลลิเฮิร์ตซ์ เราคาดว่าปัญหาเหล่านี้จะได้รับการแก้ไขใน OpenSL ES เวอร์ชันถัดไป ซึ่งจะเปิดตัวรูปแบบข้อมูล PCM แบบขยายใหม่ที่จะอนุญาตให้แอปพลิเคชันระบุการแสดงผลอย่างชัดเจนและแก้ไขชื่อช่อง เนื่องจากนี่เป็นรูปแบบข้อมูลใหม่ และรูปแบบข้อมูล PCM ปัจจุบันจะยังคงใช้งานได้ (แม้จะเลิกใช้งาน) จึงไม่จำเป็นต้องเปลี่ยนแปลงโค้ดโดยทันที