यूएसबी एपीआई का इस्तेमाल करके, यूएसबी ऑडियो सहायक डिवाइस (जैसे- कीबोर्ड, माउस, मॉनिटर, वेबकैम वगैरह) को सीधे ऐक्सेस करने की कोशिश करते समय, कोई समस्या नहीं होती. इन समस्याओं में ये शामिल हो सकते हैं: सुरक्षा से जुड़ी समस्याएं, मीडिया को सीमित करना दूसरे ऐप्लिकेशन से वीडियो चलाने के साथ-साथ अलार्म, सूचनाएं, और रिंगटोन का दिखना बंद हो गया है यूएसबी डिवाइस.
ऑडियो प्लेबैक को बेहतर बनाने के लिए, इसके बजाय मिक्सर विशेषताओं को कॉन्फ़िगर करें.
मिक्सर की विशेषताएं कॉन्फ़िगर करें
इसका इस्तेमाल करके
AudioMixerAttributes
एपीआई,
अपने ऐप्लिकेशन को यूएसबी पर पसंदीदा मिक्सर एट्रिब्यूट के साथ कॉन्फ़िगर किया जा सकता है.
जब आपके ऐप्लिकेशन का प्लेबैक, कोड में बदलने के फ़ॉर्मैट, चैनल मास्क, और सैंपल से मेल खाता हो पसंदीदा मिक्सर विशेषताओं की दर, प्लेबैक ऑडियो से जुड़ा हुआ है आउटपुट स्ट्रीम जिसका मिक्सर, पसंदीदा मिक्सर एट्रिब्यूट के साथ कॉन्फ़िगर किया गया है.
आपका ऐप्लिकेशन हार्डवेयर ऐब्स्ट्रक्शन में किसी भी कॉन्फ़िगरेशन पर स्ट्रीम कर सकता है लेयर (HAL) में तब तक ट्रांसफ़र किया जा सकता है, जब तक USB डिवाइस कॉन्फ़िगरेशन.
AudioMixerAttributes
में दो मिक्सर व्यवहार की अनुमति है DEFAULT
और
BIT_PERFECT
. जब मिक्सर के काम करने का तरीका DEFAULT
है, तो इससे पता चलता है कि ऑडियो
अलग-अलग सोर्स का डेटा मिला-जुलाना होता है.
जब मिक्सर BIT_PERFECT
हो, तब ऑडियो मिक्सिंग न हो, आवाज़ में बदलाव न हो,
या ऑडियो का प्रोसेस किया गया इफ़ेक्ट, वीडियो चलाने पर लागू होता है. डेटा इस तौर पर भेजा जाता है
HAL और आखिर में यूएसबी डिवाइस तक.
BIT_PERFECT
का इस्तेमाल करने पर, आपको डायरेक्ट स्ट्रीम करने की सुविधा मिलती है
Android पर चलने वाले डिवाइसों पर पल्स कोड मॉड्यूलेशन (पीसीएम) पर डिजिटल (डीएसडी).
नीचे दिया गया कोड सैंपल देखें कि इस प्रोसेस को कैसे पूरा किया जा सकता है:
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
}
}