برای پخش صدا در اندروید می توانید از این مکانیسم ها استفاده کنید:
هر مکانیزم امکان پخش صدا را در اندروید می دهد. برای پخش رادیو یا پخش از دستگاههای ورودی، این گزینهها ممکن است کافی نباشند، اگرچه هر کدام میتوانند با ضبط صدا یا کلاس MediaRecorder
همراه شوند تا ابتدا صدا را ضبط کرده و سپس آن را از Android پخش کنند. به طور خاص برای برنامه های سیستم، اطلاعات زیر را می توان برای اتصال یک دستگاه ورودی به یک میکسر خروجی در AAOS استفاده کرد.
پخش کننده HwAudioSource
HwAudioSource
دستگاه منبع صوتی را مستقیماً به یک میکسر اندروید متصل می کند.
انگیزه ها
ممکن است هنگام استفاده از وصله صوتی دستگاه به دستگاه یا سخت افزار با Android، چندین محدودیت ایجاد شود. هر گزینه نمیتواند رویدادهای کلیدی رسانهای مانند PLAY ، MAUSE و STOP را دریافت کند و چون پشته صوتی Android را دور میزند، هر کدام به سختافزار نیاز دارند تا پچ را با صدای دیگر اندروید ترکیب کنند.
از HwAudioSource استفاده کنید
HwAudioSource
نوع جدیدی از پخش کننده است که به عنوان یک پچ نرم افزاری طراحی شده است. این برنامههایی را که از این پخشکننده برای دریافت رویدادهای کلیدی رسانهای استفاده میکنند و جریان خروجی توسط Android میکس و مسیریابی میشود را قادر میسازد.
mHwAudioSource = new HwAudioSource.Builder()
.setAudioDeviceInfo(AudioDeviceInfo: info)
.setAudioAttributes(new AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_MEDIA)
.build())
.build();
mHwAudioSource.play();
mHwAudioSource.stop();
تغییرات در HAL صوتی
با این پخش کننده جدید، این انتظارات را برای HAL صوتی در نظر بگیرید. برای مثال، device/generic/car/emulator/audio/driver/audio_hw.c
.
adev_create_audio_patch
انتظار دارد که درخواست ایجاد یک پچ صوتی از یک دستگاه به یک میکسر باشد.adev_open_input_stream
انتظار دارد منبعaudio_source
AUDIO_SOURCE_FM_TUNER
باشد.in_read
بافر صدا را با داده های صوتی رادیویی پخش شده پر می کند.
توصیه می کنیم یک دستگاه تیونر با نوع AUDIO_DEVICE_IN_FM_TUNER
را در audio_policy_configuration.xml
پیکربندی کنید:
<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>
با پیکربندی این دستگاه، میتوانید با استفاده از AudioManager.getDevices(AudioManager.GET_DEVICES_INPUTS
در ارتباط با AudioDeviceInfo.TYPE_FM_TUNER
دستگاه ورودی رادیو FM را پیدا کنید.
پچ های صوتی ایجاد کنید
شما می توانید یک پچ صوتی بین دو پورت صدا ایجاد کنید، یک پورت میکس یا یک پورت دستگاه. به طور معمول، یک پچ صوتی از پورت ترکیبی به پورت دستگاه برای پخش است در حالی که جهت معکوس برای ضبط است.
به عنوان مثال، یک وصله صوتی که نمونه های صوتی را از منبع FM_TUNER
مستقیماً به سینک رسانه هدایت می کند، میکسر نرم افزار را دور می زند. سپس باید از یک میکسر سخت افزاری برای مخلوط کردن نمونه های صوتی از Android و FM_TUNER
برای سینک استفاده کنید. هنگام ایجاد یک وصله صوتی مستقیماً از منبع FM_TUNER
به سینک رسانه:
کنترل صدا روی سینک رسانه اعمال میشود و باید روی صدای Android و
FM_TUNER
تأثیر بگذارد.کاربران میتوانند از طریق یک سوئیچ برنامه ساده، بین صدای Android و
FM_TUNER
جابجا شوند (بدون نیاز به انتخاب منبع رسانه صریح).
پیاده سازی های خودرو همچنین ممکن است نیاز به ایجاد یک پچ صوتی بین دو پورت دستگاه داشته باشند. برای انجام این کار، ابتدا باید پورت های دستگاه و مسیرهای احتمالی را در audio_policy_configuration.xml
اعلام کنید و سپس mixport ها را با پورت های دستگاه مرتبط کنید.
پیکربندی نمونه
این نمونه پیکربندی، 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>
API درایور صوتی
میتوانید از getExternalSources()
برای بازیابی فهرستی از منابع موجود (که با آدرس مشخص شدهاند) استفاده کنید، سپس وصلههای صوتی را بین این منابع و پورتهای سینک با استفاده از صدا ایجاد کنید. نقاط ورودی مربوطه در Audio HAL در IDevice.hal
ظاهر می شود:
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);
...
}
تیونر رادیو
هنگام ساختن یک برنامه رادیویی، توصیه میکنیم از HwAudioSource
استفاده کنید زیرا هم ایجاد پچ و هم یک جلسه رسانه را برای مدیریت رویدادهای کلیدی رسانه انجام میدهد. چندین منبع صوتی را می توان برای همان منبع و ویژگی های صوتی ایجاد کرد. این امکان وجود دارد که یکی برای استفاده منظم از رادیو و همچنین دیگری برای اطلاعیه های ترافیکی داشته باشید.
در صورت ضبط FM_TUNER
، در Android 11 مجوز انجام به android.permission.CAPTURE_AUDIO_OUTPUT
تغییر یافت. دیگر از طریق بررسی مجوز OP_RECORD_AUDIO
، که فقط برای میکروفونها اعمال میشود، انجام نمیشود. این نباید روی برنامهها تأثیر بگذارد زیرا FM_TUNER
از قبل برای دسترسی به مجوز SYSTEM_API
نیاز دارد.
برای جزئیات در مورد ساخت یک برنامه رادیویی به Implement radio مراجعه کنید.