USB API'lerini kullanarak doğrudan USB ses çevre birimine erişmeye çalıştığınızda ortaya çıkar. Bu sorunlar şunları içerebilir: güvenlik sorunları, medyanın sınırlandırılması ve alarmların, bildirimlerin ve zillerin kaybolmasına neden olur. Ayrıca, USB cihazları.
Daha iyi ses çalma işlemi için mikser özelliklerini yapılandırın.
Karıştırıcı özelliklerini yapılandırma
Şunu kullanarak:
AudioMixerAttributes
API,
Uygulamanızı USB üzerinden tercih edilen mikser özellikleriyle yapılandırabilirsiniz.
Uygulamanız kodlama biçimi, kanal maskesi ve örnekle eşleştiğinde tercih edilen mikser özelliklerinin hızına bağlı olarak, oynatma tercih edilen mikser özellikleriyle yapılandırılan çıkış akışı.
Uygulamanız tüm yapılandırmalarda donanım soyutlama akışında akış gerçekleştirebilir. katmanına (HAL) ve USB cihazı yapılandırma.
AudioMixerAttributes
içinde izin verilen iki mikser davranışı DEFAULT
ve
BIT_PERFECT
. Mikser davranışı DEFAULT
olduğunda ses
Farklı kaynaklardan gelen veriler karışık halde.
Mikser davranışı BIT_PERFECT
olduğunda ses miksleme, ses seviyesi ayarlama ve
veya ses işlenen efekti oynatmaya uygulanır. Veriler şu şekilde gönderilir:
son olarak da USB cihazına bağlanıyor.
BIT_PERFECT
ile yayınları yönlendirebilirsiniz
dijital (DSD), atım kodu modülasyonu (PCM) üzerinde çalışıyor.
Aşağıdaki kod örneğinde bunun nasıl gerçekleştirilebileceği gösterilmektedir:
Kotlin
val EXPECTED_FORMAT: AudioFormat = AudioFormat.Builder() .setEncoding(AudioFormat.ENCODING_PCM_24BIT_PACKED) .setChannelMask(AudioFormat.CHANNEL_OUT_STEREO) .setSampleRate(44100) .build() fun startPlayback() { // Query all supported mixer attributes val mixerAttributesList: List<AudioMixerAttributes?> = mAudioManager.getSupportedMixerAttributes(usbDevice) // Find the wanted mixer attributes val mixerAttributes = mixerAttributesList.stream() .filter { mixerAttr: AudioMixerAttributes? -> EXPECTED_FORMAT.equals( mixerAttr!!.format ) } .findAny() .orElse(null) // Register a listener to mixer attributes changed val listener = MyPreferredMixerAttributesChangedListener() mAudioManager.addOnPreferredMixerAttributesChangedListener( Executors.newSingleThreadExecutor(), listener ) // Currently, only media usage over USB devices will be allowed val attr: AudioAttributes = AudioAttributes.Builder() .setUsage(AudioAttributes.USAGE_MEDIA).build() // Set preferred mixer attributes mAudioManager.setPreferredMixerAttributes( attr, usbDevice, mixerAttributes ) // Start playback, note the playback and the audio format must // match what is set when calling `setPreferredMixerAttriutes` // API. val audioTrack = AudioTrack.Builder() .setAudioAttributes(attr) .setAudioFormat(mixerAttributes!!.format) .build() // Clear all preferred mixer attributes related stuff when // playback task is completed mAudioManager.clearPreferredMixerAttributes(attr, usbDevice) mAudioManager.removeOnPreferredMixerAttributesChangedListener(listener) } private class MyPreferredMixerAttributesChangedListener : AudioManager.OnPreferredMixerAttributesChangedListener { override fun onPreferredMixerAttributesChanged( attributes: AudioAttributes, device: AudioDeviceInfo, mixerAttributes: AudioMixerAttributes?, ) { // Do something when preferred mixer attributes changed } }
Java
final AudioFormat EXPECTED_FORMAT = new AudioFormat.Builder() .setEncoding(AudioFormat.ENCODING_PCM_24BIT_PACKED) .setChannelMask(AudioFormat.CHANNEL_OUT_STEREO) .setSampleRate(44100) .build(); void startPlayback() { // Query all supported mixer attributes List<AudioMixerAttributes> mixerAttributesList = mAudioManager.getSupportedMixerAttributes(usbDevice); // Find the wanted mixer attributes AudioMixerAttributes mixerAttributes = mixerAttributesList.stream() .filter(mixerAttr -> EXPECTED_FORMAT.equals(mixerAttr.getFormat())) .findAny() .orElse(null); // Register a listener to mixer attributes changed MyPreferredMixerAttributesChangedListener listener = new MyPreferredMixerAttributesChangedListener(); mAudioManager.addOnPreferredMixerAttributesChangedListener( Executors.newSingleThreadExecutor(), listener); // Currently, only media usage over USB devices will be allowed AudioAttributes attr = new AudioAttributes.Builder() .setUsage(AudioAttributes.USAGE_MEDIA).build(); // Set preferred mixer attributes mAudioManager.setPreferredMixerAttributes( attr, usbDevice, mixerAttributes); // Start playback, note the playback and the audio format must // match what is set when calling `setPreferredMixerAttriutes` // API. AudioTrack audioTrack = new AudioTrack.Builder() .setAudioAttributes(attr) .setAudioFormat(mixerAttributes.getFormat()) .build(); // Clear all preferred mixer attributes related stuff when // playback task is completed mAudioManager.clearPreferredMixerAttributes(attr, usbDevice); mAudioManager.removeOnPreferredMixerAttributesChangedListener( listener); } private class MyPreferredMixerAttributesChangedListener implements AudioManager.OnPreferredMixerAttributesChangedListener { @Override public void onPreferredMixerAttributesChanged( AudioAttributes attributes, AudioDeviceInfo device, AudioMixerAttributes mixerAttributes) { // Do something when preferred mixer attributes changed } }