Wenn Sie versuchen, über die USB-APIs direkt auf das USB-Audio-Peripheriegerät zuzugreifen, wenn Probleme auftreten. Zu diesen Problemen zählen unter anderem Sicherheitsprobleme, die Einschränkung von Medien Wiedergabe von anderen Apps sowie den Verlust von Alarmen, Benachrichtigungen und Klingeltönen USB-Geräte
Konfigurieren Sie zur Verbesserung der Audiowiedergabe stattdessen die Mixerattribute.
Mixer-Attribute konfigurieren
Mit der Methode
AudioMixerAttributes
APIs
können Sie Ihre App mit bevorzugten Mixerattributen über USB konfigurieren.
Wenn die Wiedergabe deiner App mit dem Codierungsformat, der Kanalmaske und dem Sample übereinstimmt der bevorzugten Mixer-Attribute festlegen, wird die Wiedergabe an die Ausgabestream, dessen Mischer mit den bevorzugten Mixerattributen konfiguriert ist.
Ihre App kann mit jeder Konfiguration an die Hardwareabstraktion streamen Layer (HAL) und an das Gerät übertragen, sofern das USB-Gerät die Konfiguration.
Die beiden zulässigen Mischverhaltensweisen in AudioMixerAttributes
sind DEFAULT
und
BIT_PERFECT
Lautet das Mischerverhalten DEFAULT
, bedeutet das,
Daten aus verschiedenen Quellen vermischt sind.
Wenn das Mischpult auf „BIT_PERFECT
“ eingestellt ist, gibt es kein Audiomixing, keine Lautstärkeanpassung.
oder „Audio verarbeitet“ wird auf die Wiedergabe angewendet. Die Daten werden gesendet als
zum HAL und schließlich zum USB-Gerät.
Mit BIT_PERFECT
kannst du direkt streamen
Digital (DSD) Over Pulse Code Modulation (PCM) auf Android-Mobilgeräten.
Das folgende Codebeispiel zeigt, wie dies erreicht werden kann:
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
}
}
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
}
}