Android'de ses çalmak için şu mekanizmaları kullanabilirsiniz:
Her mekanizma, Android'de ses oynatımının gerçekleştirilmesine izin verir. Giriş aygıtlarından radyo oynatmak veya oynatmak için bu seçenekler yeterli olmayabilir, ancak her biri önce sesi yakalamak ve ardından Android'den oynatmak için ses yakalama veya MediaRecorder
sınıfıyla birleştirilebilir. Özellikle sistem uygulamaları için, bir giriş cihazını AAOS'taki bir çıkış mikserine bağlamak için aşağıdaki bilgiler kullanılabilir.
HwAudioSource oynatıcı
HwAudioSource
ses kaynağı cihazını doğrudan bir Android mikserine bağlar.
Motivasyonlar
Android ile cihazdan cihaza veya donanım ses yamasını kullanırken çeşitli sınırlamalar ortaya çıkabilir. Her seçenek OYNAT , DURAKLAT ve DURDUR gibi medya anahtarı olaylarını alamaz ve Android'in ses yığınını atlattıklarından her biri, yamayı Android'deki diğer seslerle karıştırmak için donanım gerektirir.
HwAudioSource'u kullanın
HwAudioSource
, yazılım yaması olarak tasarlanmış yeni bir oynatıcı türüdür. Bu, bu oynatıcıyı kullanan uygulamaların medya anahtarı olaylarını almasına ve çıkış akışının Android tarafından karıştırılıp yönlendirilmesine olanak tanır.
mHwAudioSource = new HwAudioSource.Builder()
.setAudioDeviceInfo(AudioDeviceInfo: info)
.setAudioAttributes(new AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_MEDIA)
.build())
.build();
mHwAudioSource.play();
mHwAudioSource.stop();
Ses HAL'indeki değişiklikler
Bu yeni oynatıcıyla ses HAL'ine ilişkin bu beklentileri göz önünde bulundurun. Örneğin, device/generic/car/emulator/audio/driver/audio_hw.c
.
adev_create_audio_patch
isteğin bir cihazdan miksere bir ses yaması oluşturmasını bekler.adev_open_input_stream
audio_source
AUDIO_SOURCE_FM_TUNER
olmasını bekler.in_read
ses arabelleğini yayın radyo ses verileriyle doldurur.
audio_policy_configuration.xml
dosyasında AUDIO_DEVICE_IN_FM_TUNER
türünde bir tuner cihazı yapılandırmanızı öneririz:
<devicePort
tagName="Tuner_source"
type="AUDIO_DEVICE_IN_FM_TUNER"
role="source"
address="tuner0">
<profile
name=""
format="AUDIO_FORMAT_PCM_16_BIT"
samplingRates="48000"
channelMasks="AUDIO_CHANNEL_IN_STEREO"/>
</devicePort>
Bu cihaz yapılandırmasıyla, AudioManager.getDevices(AudioManager.GET_DEVICES_INPUTS
öğesini AudioDeviceInfo.TYPE_FM_TUNER
ile birlikte kullanarak FM radyo giriş cihazını bulmayı kolaylaştırabilirsiniz.
Ses yamaları oluşturun
Karıştırma bağlantı noktası veya aygıt bağlantı noktası olmak üzere iki ses bağlantı noktası arasında bir ses yaması oluşturabilirsiniz. Tipik olarak, karıştırma bağlantı noktasından cihaz bağlantı noktasına bir ses yaması oynatma içindir, ters yön ise yakalama içindir.
Örneğin, ses örneklerini FM_TUNER
kaynağından doğrudan medya havuzuna yönlendiren bir ses yaması, yazılım karıştırıcısını atlar. Daha sonra havuz için Android ve FM_TUNER
gelen ses örneklerini karıştırmak için bir donanım karıştırıcısı kullanmalısınız. Doğrudan FM_TUNER
kaynağından ortam havuzuna bir ses yaması oluştururken:
Ses seviyesi kontrolü medya havuzu için geçerlidir ve hem Android hem de
FM_TUNER
sesini etkilemelidir.Kullanıcılar, basit bir uygulama geçişi aracılığıyla Android ve
FM_TUNER
ses arasında geçiş yapabilir (açık bir medya kaynağı seçimine gerek yoktur).
Otomotiv uygulamalarının iki cihaz bağlantı noktası arasında bir ses yaması oluşturması da gerekebilir. Bunu yapmak için öncelikle audio_policy_configuration.xml
dosyasında cihaz bağlantı noktalarını ve olası rotaları bildirmeniz ve ardından mixport'ları cihaz bağlantı noktalarıyla ilişkilendirmeniz gerekir.
Örnek konfigürasyon
Bu örnek yapılandırmaya bakın, device/generic/car/emulator/audio/audio_policy_configuration.xml
.
<audioPolicyConfiguration>
<modules>
<module name="primary" halVersion="3.0">
<attachedDevices>
<item>bus0_media_out</item>
<item>bus1_audio_patch_test_in</item>
</attachedDevices>
<mixPorts>
<mixPort name="mixport_bus0_media_out" role="source"
flags="AUDIO_OUTPUT_FLAG_PRIMARY">
<profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
samplingRates="48000"
channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
</mixPort>
<mixPort name="mixport_audio_patch_in" role="sink">
<profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
samplingRates="48000"
channelMasks="AUDIO_CHANNEL_IN_STEREO"/>
</mixPort>
</mixPorts>
<devicePorts>
<devicePort tagName="bus0_media_out" role="sink" type="AUDIO_DEVICE_OUT_BUS"
address="bus0_media_out">
<profile balance="" format="AUDIO_FORMAT_PCM_16_BIT"
samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
<gains>
<gain name="" mode="AUDIO_GAIN_MODE_JOINT"
minValueMB="-8400" maxValueMB="4000" defaultValueMB="0" stepValueMB="100"/>
</gains>
</devicePort>
<devicePort tagName="bus1_audio_patch_test_in" type="AUDIO_DEVICE_IN_BUS" role="source"
address="bus1_audio_patch_test_in">
<profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
samplingRates="48000" channelMasks="AUDIO_CHANNEL_IN_STEREO"/>
<gains>
<gain name="" mode="AUDIO_GAIN_MODE_JOINT"
minValueMB="-8400" maxValueMB="4000" defaultValueMB="0" stepValueMB="100"/>
</gains>
</devicePort>
</devicePorts>
<routes>
<route type="mix" sink="bus0_media_out" sources="mixport_bus0_media_out,bus1_audio_patch_test_in"/>
<route type="mix" sink="mixport_audio_patch_in" sources="bus1_audio_patch_test_in"/>
</routes>
</module>
</modules>
</audioPolicyConfiguration>
Ses sürücüsü API'si
Kullanılabilir kaynakların (adresle tanımlanan) bir listesini almak için getExternalSources()
işlevini kullanabilir, ardından ses kullanımlarına göre bu kaynaklar ile havuz bağlantı noktaları arasında ses yamaları oluşturabilirsiniz. Audio HAL'deki ilgili giriş noktaları IDevice.hal
görünür:
Interface IDevice {
...
/
* Creates an audio patch between several source and sink ports. The handle
* is allocated by the HAL and must be unique for this audio HAL module.
*
* @param sources patch sources.
* @param sinks patch sinks.
* @return retval operation completion status.
* @return patch created patch handle.
*/
createAudioPatch(vec<AudioPortConfig> sources, vec<AudioPortConfig> sinks)
generates (Result retval, AudioPatchHandle patch);
* Release an audio patch.
*
* @param patch patch handle.
* @return retval operation completion status.
*/
releaseAudioPatch(AudioPatchHandle patch) generates (Result retval);
...
}
Radyo alıcısı
Bir radyo uygulaması oluştururken, HwAudioSource
kullanmanızı öneririz çünkü hem yamayı oluşturmayı hem de medya anahtarı olaylarını yönetmek için bir medya oturumunu yönetir. Aynı kaynak ve ses özellikleri için birden fazla ses kaynağı oluşturulabilir. Bir tanesini normal radyo kullanımı için, diğerini ise trafik duyuruları için kullanmak mümkündür.
FM_TUNER
kaydediliyorsa, Android 11'de yapma izni android.permission.CAPTURE_AUDIO_OUTPUT
olarak değiştirildi. Artık yalnızca mikrofonlar için geçerli olan OP_RECORD_AUDIO
izin kontrolünden geçmiyor. FM_TUNER
erişim için zaten SYSTEM_API
izni gerektirdiğinden bu durum uygulamaları etkilememelidir.
Radyo uygulaması oluşturmayla ilgili ayrıntılar için Radyo uygulama konusuna bakın.