@@ -498,6 +498,8 @@ static const char * const device_table[SND_DEVICE_MAX] = {
498
498
[SND_DEVICE_OUT_SPEAKER_SAFE ] = "speaker-safe" ,
499
499
[SND_DEVICE_OUT_HEADPHONES ] = "headphones" ,
500
500
[SND_DEVICE_OUT_HEADPHONES_DSD ] = "headphones-dsd" ,
501
+ [SND_DEVICE_OUT_HEADPHONES_HIFI_FILTER ] = "headphones-hifi-filter" ,
502
+ [SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES_HIFI_FILTER ] = "speaker-and-headphones-hifi-filter" ,
501
503
[SND_DEVICE_OUT_HEADPHONES_44_1 ] = "headphones-44.1" ,
502
504
[SND_DEVICE_OUT_LINE ] = "line" ,
503
505
[SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES ] = "speaker-and-headphones" ,
@@ -830,6 +832,8 @@ static int acdb_device_table[SND_DEVICE_MAX] = {
830
832
[SND_DEVICE_OUT_TRANSMISSION_FM ] = 0 ,
831
833
[SND_DEVICE_OUT_ANC_HEADSET ] = 26 ,
832
834
[SND_DEVICE_OUT_ANC_FB_HEADSET ] = 27 ,
835
+ [SND_DEVICE_OUT_HEADPHONES_HIFI_FILTER ] = 188 ,
836
+ [SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES_HIFI_FILTER ] = 188 ,
833
837
[SND_DEVICE_OUT_VOICE_ANC_HEADSET ] = 26 ,
834
838
[SND_DEVICE_OUT_VOICE_ANC_FB_HEADSET ] = 27 ,
835
839
[SND_DEVICE_OUT_SPEAKER_AND_ANC_HEADSET ] = 26 ,
@@ -999,6 +1003,8 @@ static struct name_to_index snd_device_name_index[SND_DEVICE_MAX] = {
999
1003
{TO_NAME_INDEX (SND_DEVICE_OUT_SPEAKER_SAFE )},
1000
1004
{TO_NAME_INDEX (SND_DEVICE_OUT_HEADPHONES )},
1001
1005
{TO_NAME_INDEX (SND_DEVICE_OUT_HEADPHONES_DSD )},
1006
+ {TO_NAME_INDEX (SND_DEVICE_OUT_HEADPHONES_HIFI_FILTER )},
1007
+ {TO_NAME_INDEX (SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES_HIFI_FILTER )},
1002
1008
{TO_NAME_INDEX (SND_DEVICE_OUT_HEADPHONES_44_1 )},
1003
1009
{TO_NAME_INDEX (SND_DEVICE_OUT_LINE )},
1004
1010
{TO_NAME_INDEX (SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES )},
@@ -2118,6 +2124,9 @@ static void set_platform_defaults(struct platform_data * my_data)
2118
2124
backend_tag_table [SND_DEVICE_IN_CAPTURE_FM ] = strdup ("capture-fm" );
2119
2125
backend_tag_table [SND_DEVICE_OUT_TRANSMISSION_FM ] = strdup ("transmission-fm" );
2120
2126
backend_tag_table [SND_DEVICE_OUT_HEADPHONES_DSD ] = strdup ("headphones-dsd" );
2127
+ backend_tag_table [SND_DEVICE_OUT_HEADPHONES_HIFI_FILTER ] = strdup ("headphones-hifi-filter" );
2128
+ backend_tag_table [SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES_HIFI_FILTER ] =
2129
+ strdup ("speaker-and-headphones-hifi-filter" );
2121
2130
backend_tag_table [SND_DEVICE_OUT_HEADPHONES_44_1 ] = strdup ("headphones-44.1" );
2122
2131
backend_tag_table [SND_DEVICE_OUT_VOICE_SPEAKER_VBAT ] = strdup ("voice-speaker-vbat" );
2123
2132
backend_tag_table [SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT ] = strdup ("voice-speaker-2-vbat" );
@@ -4882,6 +4891,9 @@ int platform_get_backend_index(snd_device_t snd_device)
4882
4891
if (strncmp (backend_tag_table [snd_device ], "headphones-44.1" ,
4883
4892
sizeof ("headphones-44.1" )) == 0 )
4884
4893
port = HEADPHONE_44_1_BACKEND ;
4894
+ else if (strncmp (backend_tag_table [snd_device ], "headphones-hifi-filter" ,
4895
+ sizeof ("headphones-hifi-filter" )) == 0 )
4896
+ port = HEADPHONE_BACKEND ;
4885
4897
else if (strncmp (backend_tag_table [snd_device ], "headphones-dsd" ,
4886
4898
sizeof ("headphones-dsd" )) == 0 )
4887
4899
port = DSD_NATIVE_BACKEND ;
@@ -5508,6 +5520,12 @@ int platform_split_snd_device(void *platform,
5508
5520
new_snd_devices [0 ] = SND_DEVICE_OUT_SPEAKER ;
5509
5521
new_snd_devices [1 ] = SND_DEVICE_OUT_USB_HEADSET ;
5510
5522
ret = 0 ;
5523
+ } else if (snd_device == SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES_HIFI_FILTER &&
5524
+ !platform_check_backends_match (SND_DEVICE_OUT_SPEAKER , SND_DEVICE_OUT_HEADPHONES_HIFI_FILTER )) {
5525
+ * num_devices = 2 ;
5526
+ new_snd_devices [0 ] = SND_DEVICE_OUT_SPEAKER ;
5527
+ new_snd_devices [1 ] = SND_DEVICE_OUT_HEADPHONES_HIFI_FILTER ;
5528
+ ret = 0 ;
5511
5529
} else if (snd_device == SND_DEVICE_OUT_SPEAKER_AND_BT_SCO &&
5512
5530
!platform_check_backends_match (SND_DEVICE_OUT_SPEAKER , SND_DEVICE_OUT_BT_SCO )) {
5513
5531
* num_devices = 2 ;
@@ -5691,6 +5709,9 @@ snd_device_t platform_get_output_snd_device(void *platform, struct stream_out *o
5691
5709
snd_device = SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES_EXTERNAL_2 ;
5692
5710
else if (is_active_voice_call )
5693
5711
snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_AND_VOICE_HEADPHONES ;
5712
+ else if (audio_extn_is_hifi_filter_enabled (adev , out , snd_device ,
5713
+ my_data -> codec_variant , channel_count , 1 ))
5714
+ snd_device = SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES_HIFI_FILTER ;
5694
5715
else
5695
5716
snd_device = SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES ;
5696
5717
} else if (devices == (AUDIO_DEVICE_OUT_LINE |
@@ -5714,6 +5735,9 @@ snd_device_t platform_get_output_snd_device(void *platform, struct stream_out *o
5714
5735
snd_device = SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES_EXTERNAL_1 ;
5715
5736
else if (my_data -> external_spk_2 )
5716
5737
snd_device = SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES_EXTERNAL_2 ;
5738
+ else if (audio_extn_is_hifi_filter_enabled (adev , out , snd_device ,
5739
+ my_data -> codec_variant , channel_count , 1 ))
5740
+ snd_device = SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES_HIFI_FILTER ;
5717
5741
else {
5718
5742
if (is_active_voice_call )
5719
5743
snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_AND_VOICE_HEADPHONES ;
@@ -5980,6 +6004,11 @@ snd_device_t platform_get_output_snd_device(void *platform, struct stream_out *o
5980
6004
snd_device = SND_DEVICE_OUT_HEADPHONES_44_1 ;
5981
6005
} else if (out -> format == AUDIO_FORMAT_DSD ) {
5982
6006
snd_device = SND_DEVICE_OUT_HEADPHONES_DSD ;
6007
+ } else if (audio_extn_is_hifi_filter_enabled (adev , out , snd_device ,
6008
+ my_data -> codec_variant , channel_count , 1 )) {
6009
+ snd_device = SND_DEVICE_OUT_HEADPHONES_HIFI_FILTER ;
6010
+ } else if (devices & SND_DEVICE_OUT_HEADPHONES_HIFI_FILTER ) {
6011
+ snd_device = SND_DEVICE_OUT_HEADPHONES_HIFI_FILTER ;
5983
6012
} else if (devices & AUDIO_DEVICE_OUT_LINE ) {
5984
6013
snd_device = SND_DEVICE_OUT_LINE ;
5985
6014
} else
@@ -7177,7 +7206,7 @@ static void true_32_bit_set_params(struct str_parms *parms,
7177
7206
ret = str_parms_get_str (parms , AUDIO_PARAMETER_KEY_TRUE_32_BIT ,
7178
7207
value ,len );
7179
7208
if (ret >= 0 ) {
7180
- if (value && !strncmp (value , "true" , sizeof ("src " )))
7209
+ if (value && !strncmp (value , "true" , sizeof ("true " )))
7181
7210
supports_true_32_bit = true;
7182
7211
else
7183
7212
supports_true_32_bit = false;
@@ -7527,6 +7556,7 @@ int platform_set_parameters(void *platform, struct str_parms *parms)
7527
7556
audio_extn_hfp_set_parameters (my_data -> adev , parms );
7528
7557
perf_lock_set_params (platform , parms , value , len );
7529
7558
true_32_bit_set_params (parms , value , len );
7559
+ audio_extn_hifi_filter_set_params (parms , value , len );
7530
7560
platform_spkr_device_set_params (platform , parms , value , len );
7531
7561
done :
7532
7562
ALOGV ("%s: exit with code(%d)" , __func__ , ret );
@@ -8602,6 +8632,12 @@ static bool platform_check_codec_backend_cfg(struct audio_device* adev,
8602
8632
if (channels < out_channels )
8603
8633
channels = out_channels ;
8604
8634
}
8635
+ if ((snd_device == SND_DEVICE_OUT_HEADPHONES_HIFI_FILTER ) &&
8636
+ (usecase -> id == USECASE_AUDIO_PLAYBACK_LOW_LATENCY ||
8637
+ usecase -> id == USECASE_AUDIO_PLAYBACK_ULL )) {
8638
+ sample_rate = my_data -> current_backend_cfg [backend_idx ].sample_rate ;
8639
+ bit_width = my_data -> current_backend_cfg [backend_idx ].bit_width ;
8640
+ }
8605
8641
}
8606
8642
}
8607
8643
}
@@ -8701,6 +8737,37 @@ static bool platform_check_codec_backend_cfg(struct audio_device* adev,
8701
8737
}
8702
8738
}
8703
8739
8740
+ if (backend_idx != platform_get_voice_call_backend (adev )
8741
+ && usecase -> type == PCM_PLAYBACK ) {
8742
+ struct stream_out * out = (struct stream_out * ) usecase -> stream .out ;
8743
+ if (audio_extn_is_hifi_filter_enabled (adev , out , snd_device ,
8744
+ my_data -> codec_variant , channels , 0 )) {
8745
+ switch (sample_rate ) {
8746
+ case 48000 :
8747
+ audio_extn_enable_hifi_filter (adev , true);
8748
+ if (audio_is_true_native_stream_active (adev ))
8749
+ sample_rate = 352800 ;
8750
+ else
8751
+ sample_rate = 384000 ;
8752
+ bit_width = 32 ;
8753
+ break ;
8754
+ case 44100 :
8755
+ audio_extn_enable_hifi_filter (adev , true);
8756
+ sample_rate = 352800 ;
8757
+ bit_width = 32 ;
8758
+ break ;
8759
+ default :
8760
+ audio_extn_enable_hifi_filter (adev , false);
8761
+ }
8762
+ }
8763
+ if (snd_device != SND_DEVICE_OUT_HEADPHONES_HIFI_FILTER )
8764
+ audio_extn_enable_hifi_filter (adev , false);
8765
+ ALOGD ("%s:becf: updated afe: bitwidth %d, samplerate %d channels %d,"
8766
+ "backend_idx %d usecase = %d device (%s)" , __func__ , bit_width ,
8767
+ sample_rate , channels , backend_idx , usecase -> id ,
8768
+ platform_get_snd_device_name (snd_device ));
8769
+ }
8770
+
8704
8771
/*
8705
8772
* Handset and speaker may have diffrent backend. Check if the device is speaker or handset,
8706
8773
* and these devices are restricited to 48kHz.
@@ -8813,7 +8880,7 @@ static bool platform_check_codec_backend_cfg(struct audio_device* adev,
8813
8880
}
8814
8881
8815
8882
if (snd_device == SND_DEVICE_OUT_HEADPHONES || snd_device ==
8816
- SND_DEVICE_OUT_HEADPHONES_44_1 ) {
8883
+ SND_DEVICE_OUT_HEADPHONES_44_1 || snd_device == SND_DEVICE_OUT_HEADPHONES_HIFI_FILTER ) {
8817
8884
if (sample_rate > 48000 ||
8818
8885
(bit_width >= 24 && (sample_rate == 48000 || sample_rate == 44100 ))) {
8819
8886
ALOGI ("%s: apply HPH HQ mode\n" , __func__ );
0 commit comments