Android'de ses çalmak için aşağıdaki mekanizmaları kullanabilirsiniz:
Her mekanizma, Android'de ses oynatılmasına olanak tanır. Radyo oynatma veya giriş cihazlarından oynatma için bu seçenekler yeterli olmayabilir. Bununla birlikte, her biri ses yakalama veya MediaRecorder
sınıfıyla birlikte kullanılabilir. Böylece önce ses yakalanır, ardından Android'de oynatılır. Özellikle sistem uygulamaları için aşağıdaki bilgiler, AAOS'ta bir giriş cihazını çıkış karıştırıcısına bağlamak amacıyla kullanılabilir.
HwAudioSource oynatıcı
HwAudioSource
, ses kaynağı cihazını doğrudan bir Android miksere bağlar.
Motivasyonlar
Android ile cihazlar arası veya donanım ses yaması kullanılırken çeşitli sınırlamalar ortaya çıkabilir. Her seçenek OYNAT, DURAKLAT ve DURDUR gibi medya anahtarı etkinliklerini alamaz ve Android'in ses yığınını atladıkları için her biri, yamayı Android'deki diğer seslerle karıştırmak için donanım gerektirir.
HwAudioSource'ı kullanma
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 etkinliklerini almasını ve çıkış akışının Android tarafından karıştırılıp yönlendirilmesini sağlar.
mHwAudioSource = new HwAudioSource.Builder()
.setAudioDeviceInfo(AudioDeviceInfo: info)
.setAudioAttributes(new AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_MEDIA)
.build())
.build();
mHwAudioSource.play();
mHwAudioSource.stop();
Ses HAL'inde yapılan değişiklikler
Bu yeni oynatıcıda, ses HAL'i için aşağıdaki beklentileri göz önünde bulundurun. Örneğin, device/generic/car/emulator/audio/driver/audio_hw.c
.
adev_create_audio_patch
, bir cihazdan karıştırıcıya ses bağlantısı oluşturma isteğini bekler.adev_open_input_stream
,audio_source
değerininAUDIO_SOURCE_FM_TUNER
olmasını bekler.in_read
, ses arabelleğini radyo yayını ses verileriyle doldurur.
audio_policy_configuration.xml
'te AUDIO_DEVICE_IN_FM_TUNER
türüne sahip 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, AudioDeviceInfo.TYPE_FM_TUNER
ile birlikte AudioManager.getDevices(AudioManager.GET_DEVICES_INPUTS
'ü kullanarak FM radyo giriş cihazını bulmayı kolaylaştırabilirsiniz.
Ses yamaları oluşturma
İki ses bağlantı noktası (miks bağlantı noktası veya cihaz bağlantı noktası) arasında ses bağlantısı oluşturabilirsiniz. Karışım bağlantı noktasından cihaz bağlantı noktasına giden ses yaması genellikle oynatma içindir. Ters yön ise kayıt içindir.
Örneğin, FM_TUNER
kaynağından gelen ses örneklerini doğrudan medya havuzuna yönlendiren bir ses yaması, yazılım karıştırıcıyı atlar. Ardından, Android'deki ses örneklerini ve FM_TUNER
'ü karıştırmak için bir donanım karıştırıcı kullanmanız gerekir. Doğrudan FM_TUNER
kaynağından medya havuzuna ses yaması oluştururken:
Ses seviyesi kontrolü, medya alıcısı için geçerlidir ve hem Android hem de
FM_TUNER
seslerini etkiler.Kullanıcılar basit bir uygulama anahtarı aracılığıyla Android ve
FM_TUNER
ses arasında geçiş yapabilir (belirli bir medya kaynağı seçimi gerekmez).
Otomotiv uygulamalarında, iki cihaz bağlantı noktası arasında ses yaması oluşturmak da gerekebilir. Bunu yapmak için önce audio_policy_configuration.xml
içinde cihaz bağlantı noktalarını ve olası rotaları tanımlamanız, ardından mixport'ları cihaz bağlantı noktalarıyla ilişkilendirmeniz gerekir.
Örnek yapılandırma
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ü API'si
Mevcut kaynakların (adresle tanımlanır) listesini almak için getExternalSources()
'ü kullanabilir, ardından bu kaynaklar ile alıçı bağlantı noktaları arasında ses kullanımlarına göre ses yamaları oluşturabilirsiniz. Ses HAL'indeki ilgili giriş noktaları IDevice.hal
'te 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ı
Radyo uygulaması oluştururken hem yamayı oluşturmayı hem de medya anahtarı etkinliklerini işlemek için medya oturumunu işlediği için HwAudioSource
kullanmanızı öneririz. Aynı kaynak ve ses özellikleri için birden fazla ses kaynağı oluşturulabilir. Normal radyo kullanımı için bir kanal, trafik duyuruları için de ikinci bir kanal oluşturabilirsiniz.
FM_TUNER
kaydı yapılıyorsa Android 11'de bu işlem için izin android.permission.CAPTURE_AUDIO_OUTPUT
olarak değiştirildi.
Artık yalnızca mikrofonlar için geçerli olan OP_RECORD_AUDIO
izin kontrolü uygulanmıyor. FM_TUNER
zaten erişim için SYSTEM_API
izni gerektirdiğinden bu durum uygulamaları etkilemez.
Radyo uygulaması oluşturma hakkında ayrıntılı bilgi için Radyo uygulamasını uygulama başlıklı makaleyi inceleyin.