Android'de ses çalmak için şu mekanizmaları kullanabilirsiniz:
Her mekanizma, Android'de ses oynatılmasına olanak tanır. Radyo
çalma veya giriş cihazlarından çalma için bu seçenekler yeterli olmayabilir.
Ancak her biri, önce sesi yakalamak ve ardından Android'de oynatmak için ses yakalama veya MediaRecorder
sınıfıyla birlikte kullanılabilir. Özellikle sistem uygulamaları için aşağıdaki bilgiler, bir giriş cihazını AAOS'teki bir çıkış mikserine bağlamak üzere kullanılabilir.
HwAudioSource oynatıcısı
HwAudioSource
Ses kaynağı cihazını doğrudan bir Android miksere bağlar.
Motivasyonlar
Android'de cihazdan cihaza veya donanım ses yaması kullanırken çeşitli sınırlamalarla karşılaşabilirsiniz. Her seçenek PLAY, PAUSE ve STOP gibi medya anahtarı etkinliklerini alamaz. Ayrıca Android'in ses yığınını atladıkları için her birinin, yamayı Android'deki diğer seslerle karıştırmak üzere donanım gerektirdiği de unutulmamalıdır.
HwAudioSource'u 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'sindeki değişiklikler
Bu yeni oynatıcıyla birlikte, ses HAL'si 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 miksere ses yaması oluşturma isteğinde bulunulmasını bekler.adev_open_input_stream
,audio_source
değerininAUDIO_SOURCE_FM_TUNER
olmasını bekliyor.in_read
, ses arabelleğini radyo yayını ses verileriyle doldurur.
AUDIO_DEVICE_IN_FM_TUNER
türünde bir tuner cihazı audio_policy_configuration.xml
ile 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
ve AudioDeviceInfo.TYPE_FM_TUNER
simgelerini birlikte kullanarak FM radyo giriş cihazının bulunmasını kolaylaştırabilirsiniz.
Ses yamaları oluşturma
İki ses bağlantı noktası (karıştırma bağlantı noktası veya cihaz bağlantı noktası) arasında ses yaması oluşturabilirsiniz. Genellikle, miks bağlantı noktasından cihaz bağlantı noktasına ses yaması oynatma, ters yönde ise yakalama içindir.
Örneğin, FM_TUNER
kaynağından
ses örneklerini doğrudan medya alıcısına yönlendiren bir ses yaması, yazılım mikserini atlar. Ardından, Android'den gelen ses örneklerini ve FM_TUNER
için sink'i karıştırmak üzere bir donanım mikseri kullanmanız gerekir. Doğrudan FM_TUNER
kaynağından medya alıcısına ses yaması oluştururken:
Ses kontrolü, medya alıcısı için geçerlidir ve hem Android hem de
FM_TUNER
sesini etkilemelidir.Kullanıcılar, basit bir uygulama geçişiyle Android ve
FM_TUNER
ses arasında geçiş yapabilir (açık bir medya kaynağı seçimi yapılması gerekmez).
Otomotiv uygulamalarının iki cihaz bağlantı noktası arasında ses yaması oluşturması da gerekebilir. Bunu yapmak için önce audio_policy_configuration.xml
içinde cihaz bağlantı noktalarını ve olası rotaları beyan etmeniz, 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üsü API'si
getExternalSources()
kullanarak kullanılabilir kaynakların (adresle tanımlanır) listesini alabilir, ardından bu kaynaklar ile sink bağlantı noktaları arasında ses kullanımlarına göre ses yamaları oluşturabilirsiniz. Ses HAL'deki ilgili giriş noktaları IDevice.hal
içinde 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, yama oluşturmanın yanı sıra medya anahtarı etkinliklerini işlemek için medya oturumu oluşturmayı da sağladığından HwAudioSource
kullanmanızı öneririz. Aynı kaynak ve ses özellikleri için birden fazla ses kaynağı oluşturulabilir. Normal radyo kullanımı için bir tane, trafik duyuruları için de ikinci bir radyo olabilir.
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ünden geçmez. FM_TUNER
, erişim için SYSTEM_API
iznini gerektirdiğinden bu durum uygulamaları etkilemez.
Radyo uygulaması oluşturma hakkında ayrıntılı bilgi için Radyo uygulama başlıklı makaleyi inceleyin.