summaryrefslogtreecommitdiff
Diffstat
-rw-r--r--Android.mk1
-rwxr-xr-xamadec/Android.mk282
-rw-r--r--amadec/acodec_lib_50/libstagefright_soft_dcvdec.so80
-rw-r--r--amadec/acodec_lib_50/libstagefright_soft_dtshd.so85
-rw-r--r--amadec/acodec_lib_50/libstagefright_soft_truehddec.so41
-rw-r--r--amadec/acodec_lib_android_n/libstagefright_soft_dcvdec.so109
-rw-r--r--amadec/acodec_lib_android_n/libstagefright_soft_dtshd.so272
-rw-r--r--amadec/acodec_lib_android_n/libstagefright_soft_truehddec.so87
-rwxr-xr-xamadec/acodec_lib_mx/libstagefright_soft_ddpdec.so113
-rwxr-xr-xamadec/acodec_lib_mx/libstagefright_soft_dtshd.so121
-rw-r--r--amadec/adec-armdec-mgt.h57
-rw-r--r--amadec/adec-external-ctrl.c899
-rw-r--r--amadec/adec-ffmpeg-mgt.c1550
-rw-r--r--amadec/adec-internal-mgt.c772
-rw-r--r--amadec/adec-message.c156
-rw-r--r--amadec/adec-message.h61
-rwxr-xr-xamadec/adec-pts-mgt.c1107
-rw-r--r--amadec/adec-pts-mgt.h82
-rw-r--r--amadec/adec-wfd-out.cpp361
-rw-r--r--amadec/adec-wfd.c811
-rw-r--r--amadec/adec_omx_brige.c284
-rw-r--r--amadec/adec_omx_brige.h56
-rw-r--r--amadec/adec_read.c200
-rw-r--r--amadec/adec_reg.h76
-rw-r--r--amadec/adec_write.c189
-rw-r--r--amadec/adec_write.h42
-rw-r--r--amadec/audio-dec.h314
-rw-r--r--amadec/audio_out/alsa-out.c1082
-rw-r--r--amadec/audio_out/aml_resample.c708
-rw-r--r--amadec/audio_out/aml_resample.h86
-rwxr-xr-xamadec/audio_out/android-out.cpp1640
-rw-r--r--amadec/audiodsp_update_format.c188
-rw-r--r--amadec/dsp/audiodsp-ctl.c471
-rw-r--r--amadec/dts_enc.c209
-rw-r--r--amadec/dts_enc.h11
-rw-r--r--amadec/dts_transenc_api.c143
-rw-r--r--amadec/dts_transenc_api.h19
-rw-r--r--amadec/feeder.c231
-rw-r--r--amadec/feeder.h26
-rw-r--r--amadec/include/adec-external-ctrl.h63
-rwxr-xr-xamadec/include/adec-macros.h41
-rw-r--r--amadec/include/adec-types.h53
-rwxr-xr-xamadec/include/alsa-out.h26
-rw-r--r--amadec/include/audio-out.h41
-rw-r--r--amadec/include/audiodsp.h142
-rw-r--r--amadec/include/audiodsp_update_format.h25
-rw-r--r--amadec/include/log-print.h26
-rwxr-xr-xamadec/omx_audio/ALAC_mediasource.cpp205
-rw-r--r--amadec/omx_audio/ALAC_mediasource.h62
-rwxr-xr-xamadec/omx_audio/ASF_mediasource.cpp184
-rw-r--r--amadec/omx_audio/ASF_mediasource.h127
-rwxr-xr-xamadec/omx_audio/Android.mk34
-rwxr-xr-xamadec/omx_audio/DDP_mediasource.cpp528
-rw-r--r--amadec/omx_audio/DDP_mediasource.h141
-rw-r--r--amadec/omx_audio/DTSHD_mediasource.cpp316
-rw-r--r--amadec/omx_audio/DTSHD_mediasource.h74
-rwxr-xr-xamadec/omx_audio/MP3_mediasource.cpp579
-rw-r--r--amadec/omx_audio/MP3_mediasource.h80
-rw-r--r--amadec/omx_audio/THD_mediasource.cpp229
-rw-r--r--amadec/omx_audio/THD_mediasource.h74
-rwxr-xr-xamadec/omx_audio/Vorbis_mediasource.cpp245
-rw-r--r--amadec/omx_audio/Vorbis_mediasource.h58
-rw-r--r--amadec/omx_audio/adec_omx.cpp421
-rw-r--r--amadec/omx_audio/adec_omx.h71
-rwxr-xr-xamadec/omx_audio/audio_mediasource.cpp37
-rw-r--r--amadec/omx_audio/audio_mediasource.h46
-rw-r--r--amadec/omx_audio/audio_medissource.h137
-rw-r--r--amadec/pcmenc_api.c147
-rw-r--r--amadec/pcmenc_api.h25
-rw-r--r--amadec/spdif_api.c306
-rw-r--r--amadec/spdif_api.h26
-rwxr-xr-xaudio_codec/Android.mk1
-rw-r--r--audio_codec/config.mk10
-rwxr-xr-xaudio_codec/libadpcm/Android.mk12
-rw-r--r--audio_codec/libadpcm/adpcm.h346
-rw-r--r--audio_codec/libadpcm/adpcm_decode.c841
-rwxr-xr-xaudio_codec/libamr/Android.mk25
-rwxr-xr-xaudio_codec/libamr/Makefile5
-rw-r--r--audio_codec/libamr/amr_decode.c186
-rw-r--r--audio_codec/libamr/amr_decode.h8
-rwxr-xr-xaudio_codec/libamr/dec.h18
-rw-r--r--audio_codec/libamr/dec_acelp.c620
-rwxr-xr-xaudio_codec/libamr/dec_acelp.h17
-rw-r--r--audio_codec/libamr/dec_dtx.c683
-rw-r--r--audio_codec/libamr/dec_dtx.h49
-rw-r--r--audio_codec/libamr/dec_gain.c853
-rw-r--r--audio_codec/libamr/dec_gain.h28
-rw-r--r--audio_codec/libamr/dec_if.c834
-rwxr-xr-xaudio_codec/libamr/dec_if.h23
-rw-r--r--audio_codec/libamr/dec_lpc.c789
-rw-r--r--audio_codec/libamr/dec_lpc.h25
-rw-r--r--audio_codec/libamr/dec_main.c842
-rw-r--r--audio_codec/libamr/dec_main.h57
-rw-r--r--audio_codec/libamr/dec_rom.c2114
-rw-r--r--audio_codec/libamr/dec_util.c1304
-rw-r--r--audio_codec/libamr/dec_util.h33
-rw-r--r--audio_codec/libamr/if_rom.c1030
-rwxr-xr-xaudio_codec/libamr/if_rom.h70
-rw-r--r--audio_codec/libamr/interf_dec.c906
-rw-r--r--audio_codec/libamr/interf_dec.h56
-rw-r--r--audio_codec/libamr/interf_rom.h1788
-rw-r--r--audio_codec/libamr/rom_dec.h13274
-rw-r--r--audio_codec/libamr/sp_dec.c6078
-rw-r--r--audio_codec/libamr/sp_dec.h83
-rwxr-xr-xaudio_codec/libamr/typedef.h17
-rwxr-xr-xaudio_codec/libape/Android.mk28
-rw-r--r--audio_codec/libape/Ape_decoder.h216
-rw-r--r--audio_codec/libape/amlogic_r30813_audio_ape_lib.c1
-rw-r--r--audio_codec/libape/apedec.c1120
-rw-r--r--audio_codec/libcook/Android.mk28
-rw-r--r--audio_codec/libcook/aac_bitstream.h133
-rw-r--r--audio_codec/libcook/aac_decode.h148
-rw-r--r--audio_codec/libcook/aac_reorder.h53
-rw-r--r--audio_codec/libcook/assembly.h119
-rw-r--r--audio_codec/libcook/challenge.h132
-rw-r--r--audio_codec/libcook/codec_defines.h93
-rw-r--r--audio_codec/libcook/coder.h287
-rw-r--r--audio_codec/libcook/cook_codec.h30
-rw-r--r--audio_codec/libcook/cook_decode.c624
-rw-r--r--audio_codec/libcook/cook_decode.h35
-rw-r--r--audio_codec/libcook/ga_config.h86
-rw-r--r--audio_codec/libcook/gecko2codec.c833
-rw-r--r--audio_codec/libcook/gecko2codec.h60
-rw-r--r--audio_codec/libcook/helix_config.h92
-rw-r--r--audio_codec/libcook/helix_mime_types.h56
-rw-r--r--audio_codec/libcook/helix_result.h107
-rw-r--r--audio_codec/libcook/helix_types.h305
-rw-r--r--audio_codec/libcook/helix_utils.h106
-rw-r--r--audio_codec/libcook/md5.h113
-rw-r--r--audio_codec/libcook/memory_utils.c100
-rw-r--r--audio_codec/libcook/memory_utils.h58
-rw-r--r--audio_codec/libcook/pack_utils.c306
-rw-r--r--audio_codec/libcook/pack_utils.h93
-rw-r--r--audio_codec/libcook/packet_defines.h48
-rw-r--r--audio_codec/libcook/ra8lbr_decode.c378
-rw-r--r--audio_codec/libcook/ra8lbr_decode.h161
-rw-r--r--audio_codec/libcook/ra_backend.h94
-rw-r--r--audio_codec/libcook/ra_bitpack.c197
-rw-r--r--audio_codec/libcook/ra_buffers.c127
-rw-r--r--audio_codec/libcook/ra_category.c298
-rw-r--r--audio_codec/libcook/ra_couple.c224
-rw-r--r--audio_codec/libcook/ra_decode.c321
-rw-r--r--audio_codec/libcook/ra_decode.h183
-rw-r--r--audio_codec/libcook/ra_depack.c230
-rw-r--r--audio_codec/libcook/ra_depack.h177
-rw-r--r--audio_codec/libcook/ra_depack_internal.c1710
-rw-r--r--audio_codec/libcook/ra_depack_internal.h232
-rw-r--r--audio_codec/libcook/ra_envelope.c123
-rw-r--r--audio_codec/libcook/ra_fft.c368
-rw-r--r--audio_codec/libcook/ra_format_info.h60
-rw-r--r--audio_codec/libcook/ra_gainctrl.c584
-rw-r--r--audio_codec/libcook/ra_huffman.c86
-rw-r--r--audio_codec/libcook/ra_hufftabs.c244
-rw-r--r--audio_codec/libcook/ra_mlt.c357
-rw-r--r--audio_codec/libcook/ra_sqvh.c431
-rw-r--r--audio_codec/libcook/ra_trigtabs.c932
-rw-r--r--audio_codec/libcook/rasl.c376
-rw-r--r--audio_codec/libcook/rasl.h71
-rw-r--r--audio_codec/libcook/rdtpck.h153
-rw-r--r--audio_codec/libcook/rm_error.h54
-rw-r--r--audio_codec/libcook/rm_error_default.c58
-rw-r--r--audio_codec/libcook/rm_error_default.h53
-rw-r--r--audio_codec/libcook/rm_io_default.c101
-rw-r--r--audio_codec/libcook/rm_io_default.h49
-rw-r--r--audio_codec/libcook/rm_memory.h54
-rw-r--r--audio_codec/libcook/rm_memory_default.c54
-rw-r--r--audio_codec/libcook/rm_memory_default.h46
-rw-r--r--audio_codec/libcook/rm_packet.c117
-rw-r--r--audio_codec/libcook/rm_packet.h80
-rw-r--r--audio_codec/libcook/rm_parse.h302
-rw-r--r--audio_codec/libcook/rm_parser.c649
-rw-r--r--audio_codec/libcook/rm_parser_internal.c3342
-rw-r--r--audio_codec/libcook/rm_parser_internal.h420
-rw-r--r--audio_codec/libcook/rm_property.c105
-rw-r--r--audio_codec/libcook/rm_property.h107
-rw-r--r--audio_codec/libcook/rm_stream.c356
-rw-r--r--audio_codec/libcook/rm_stream.h115
-rw-r--r--audio_codec/libcook/rm_stream_internal.h77
-rw-r--r--audio_codec/libcook/rv20backend.h69
-rw-r--r--audio_codec/libcook/rv30backend.h68
-rw-r--r--audio_codec/libcook/rv_backend.h84
-rw-r--r--audio_codec/libcook/rv_backend_types.h198
-rw-r--r--audio_codec/libcook/rv_decode.h208
-rw-r--r--audio_codec/libcook/rv_decode_message.h492
-rw-r--r--audio_codec/libcook/rv_depack.c271
-rw-r--r--audio_codec/libcook/rv_depack.h162
-rw-r--r--audio_codec/libcook/rv_depack_internal.c1071
-rw-r--r--audio_codec/libcook/rv_depack_internal.h171
-rw-r--r--audio_codec/libcook/rv_format_info.h91
-rw-r--r--audio_codec/libcook/statname.h118
-rw-r--r--audio_codec/libcook/stream_hdr_structs.h66
-rw-r--r--audio_codec/libcook/stream_hdr_utils.c136
-rw-r--r--audio_codec/libcook/stream_hdr_utils.h77
-rw-r--r--audio_codec/libcook/string_utils.c87
-rw-r--r--audio_codec/libcook/string_utils.h62
-rw-r--r--audio_codec/libcook/tngpkt.h400
-rwxr-xr-xaudio_codec/libfaad/Android.mk101
-rwxr-xr-xaudio_codec/libfaad/Makefile130
-rw-r--r--audio_codec/libfaad/analysis.h52
-rwxr-xr-xaudio_codec/libfaad/audio.d3
-rw-r--r--audio_codec/libfaad/bits.c261
-rwxr-xr-xaudio_codec/libfaad/bits.d18
-rw-r--r--audio_codec/libfaad/bits.h446
-rw-r--r--audio_codec/libfaad/cfft.c988
-rw-r--r--audio_codec/libfaad/cfft.h55
-rw-r--r--audio_codec/libfaad/cfft_tab.h1816
-rw-r--r--audio_codec/libfaad/codebook/hcb.h140
-rw-r--r--audio_codec/libfaad/codebook/hcb_1.h186
-rw-r--r--audio_codec/libfaad/codebook/hcb_10.h312
-rw-r--r--audio_codec/libfaad/codebook/hcb_11.h415
-rw-r--r--audio_codec/libfaad/codebook/hcb_2.h185
-rw-r--r--audio_codec/libfaad/codebook/hcb_3.h196
-rw-r--r--audio_codec/libfaad/codebook/hcb_4.h199
-rw-r--r--audio_codec/libfaad/codebook/hcb_5.h196
-rw-r--r--audio_codec/libfaad/codebook/hcb_6.h182
-rw-r--r--audio_codec/libfaad/codebook/hcb_7.h162
-rw-r--r--audio_codec/libfaad/codebook/hcb_8.h173
-rw-r--r--audio_codec/libfaad/codebook/hcb_9.h372
-rw-r--r--audio_codec/libfaad/codebook/hcb_sf.h276
-rw-r--r--audio_codec/libfaad/common.c558
-rw-r--r--audio_codec/libfaad/common.h453
-rw-r--r--audio_codec/libfaad/decoder.c2266
-rw-r--r--audio_codec/libfaad/drc.c173
-rw-r--r--audio_codec/libfaad/drc.h49
-rw-r--r--audio_codec/libfaad/drm_dec.c912
-rw-r--r--audio_codec/libfaad/drm_dec.h99
-rw-r--r--audio_codec/libfaad/error.c72
-rw-r--r--audio_codec/libfaad/error.h44
-rw-r--r--audio_codec/libfaad/filtbank.c408
-rw-r--r--audio_codec/libfaad/filtbank.h61
-rw-r--r--audio_codec/libfaad/fixed.h287
-rw-r--r--audio_codec/libfaad/hcr.c422
-rw-r--r--audio_codec/libfaad/helixaac/aaccommon.h210
-rw-r--r--audio_codec/libfaad/helixaac/aacdec.c508
-rw-r--r--audio_codec/libfaad/helixaac/aacdec.h206
-rw-r--r--audio_codec/libfaad/helixaac/aactabs.c157
-rw-r--r--audio_codec/libfaad/helixaac/assembly.h631
-rw-r--r--audio_codec/libfaad/helixaac/assembly_mw.h743
-rw-r--r--audio_codec/libfaad/helixaac/bitstream.c261
-rw-r--r--audio_codec/libfaad/helixaac/bitstream.h74
-rw-r--r--audio_codec/libfaad/helixaac/buffers.c140
-rw-r--r--audio_codec/libfaad/helixaac/coder.h369
-rw-r--r--audio_codec/libfaad/helixaac/dct4.c337
-rw-r--r--audio_codec/libfaad/helixaac/decelmnt.c445
-rw-r--r--audio_codec/libfaad/helixaac/dequant.c379
-rw-r--r--audio_codec/libfaad/helixaac/fft.c391
-rw-r--r--audio_codec/libfaad/helixaac/filefmt.c539
-rw-r--r--audio_codec/libfaad/helixaac/huffman_helix.c450
-rw-r--r--audio_codec/libfaad/helixaac/hufftabs.c177
-rw-r--r--audio_codec/libfaad/helixaac/imdct.c596
-rw-r--r--audio_codec/libfaad/helixaac/noiseless.c513
-rw-r--r--audio_codec/libfaad/helixaac/pns_helix.c371
-rw-r--r--audio_codec/libfaad/helixaac/sbr.c433
-rw-r--r--audio_codec/libfaad/helixaac/sbr.h380
-rw-r--r--audio_codec/libfaad/helixaac/sbrfft.c368
-rw-r--r--audio_codec/libfaad/helixaac/sbrfreq.c673
-rw-r--r--audio_codec/libfaad/helixaac/sbrhfadj.c882
-rw-r--r--audio_codec/libfaad/helixaac/sbrhfgen.c655
-rw-r--r--audio_codec/libfaad/helixaac/sbrhuff.c494
-rw-r--r--audio_codec/libfaad/helixaac/sbrimdct.c447
-rw-r--r--audio_codec/libfaad/helixaac/sbrmath.c198
-rw-r--r--audio_codec/libfaad/helixaac/sbrqmf.c648
-rw-r--r--audio_codec/libfaad/helixaac/sbrside.c634
-rw-r--r--audio_codec/libfaad/helixaac/sbrtabs.c400
-rw-r--r--audio_codec/libfaad/helixaac/statname.h115
-rw-r--r--audio_codec/libfaad/helixaac/stproc.c251
-rw-r--r--audio_codec/libfaad/helixaac/tns_helix.c307
-rw-r--r--audio_codec/libfaad/helixaac/trigtabs.c1000
-rw-r--r--audio_codec/libfaad/helixaac/trigtabs_fltgen.c357
-rw-r--r--audio_codec/libfaad/huffman.c582
-rw-r--r--audio_codec/libfaad/huffman.h47
-rw-r--r--audio_codec/libfaad/ic_predict.c258
-rw-r--r--audio_codec/libfaad/ic_predict.h252
-rw-r--r--audio_codec/libfaad/iq_table.h16456
-rw-r--r--audio_codec/libfaad/is.c106
-rw-r--r--audio_codec/libfaad/is.h67
-rw-r--r--audio_codec/libfaad/kbd_win.h2294
-rw-r--r--audio_codec/libfaad/libaacdec.c544
-rw-r--r--audio_codec/libfaad/libaacdec.h64
-rwxr-xr-xaudio_codec/libfaad/libfaad2.def14
-rw-r--r--audio_codec/libfaad/lt_predict.c205
-rw-r--r--audio_codec/libfaad/lt_predict.h66
-rw-r--r--audio_codec/libfaad/mdct.c307
-rw-r--r--audio_codec/libfaad/mdct.h48
-rw-r--r--audio_codec/libfaad/mdct_tab.h3639
-rw-r--r--audio_codec/libfaad/mp4.c307
-rw-r--r--audio_codec/libfaad/mp4.h52
-rw-r--r--audio_codec/libfaad/ms.c71
-rw-r--r--audio_codec/libfaad/ms.h44
-rw-r--r--audio_codec/libfaad/neaacdec.h257
-rw-r--r--audio_codec/libfaad/output.c583
-rw-r--r--audio_codec/libfaad/output.h48
-rw-r--r--audio_codec/libfaad/pns.c273
-rw-r--r--audio_codec/libfaad/pns.h58
-rw-r--r--audio_codec/libfaad/ps_dec.c1905
-rw-r--r--audio_codec/libfaad/ps_dec.h151
-rw-r--r--audio_codec/libfaad/ps_syntax.c532
-rw-r--r--audio_codec/libfaad/ps_tables.h547
-rw-r--r--audio_codec/libfaad/pulse.c59
-rw-r--r--audio_codec/libfaad/pulse.h43
-rw-r--r--audio_codec/libfaad/rvlc.c524
-rw-r--r--audio_codec/libfaad/rvlc.h55
-rw-r--r--audio_codec/libfaad/sbr_dct.c2267
-rw-r--r--audio_codec/libfaad/sbr_dct.h52
-rw-r--r--audio_codec/libfaad/sbr_dec.c679
-rw-r--r--audio_codec/libfaad/sbr_dec.h253
-rw-r--r--audio_codec/libfaad/sbr_e_nf.c475
-rw-r--r--audio_codec/libfaad/sbr_e_nf.h50
-rw-r--r--audio_codec/libfaad/sbr_fbt.c737
-rw-r--r--audio_codec/libfaad/sbr_fbt.h55
-rw-r--r--audio_codec/libfaad/sbr_hfadj.c1644
-rw-r--r--audio_codec/libfaad/sbr_hfadj.h56
-rw-r--r--audio_codec/libfaad/sbr_hfgen.c647
-rw-r--r--audio_codec/libfaad/sbr_hfgen.h49
-rw-r--r--audio_codec/libfaad/sbr_huff.c344
-rw-r--r--audio_codec/libfaad/sbr_huff.h46
-rw-r--r--audio_codec/libfaad/sbr_noise.h564
-rw-r--r--audio_codec/libfaad/sbr_qmf.c614
-rw-r--r--audio_codec/libfaad/sbr_qmf.h55
-rw-r--r--audio_codec/libfaad/sbr_qmf_c.h368
-rw-r--r--audio_codec/libfaad/sbr_syntax.c893
-rw-r--r--audio_codec/libfaad/sbr_syntax.h68
-rw-r--r--audio_codec/libfaad/sbr_tf_grid.c247
-rw-r--r--audio_codec/libfaad/sbr_tf_grid.h47
-rw-r--r--audio_codec/libfaad/sine_win.h4296
-rw-r--r--audio_codec/libfaad/specrec.c1249
-rw-r--r--audio_codec/libfaad/specrec.h49
-rw-r--r--audio_codec/libfaad/ssr.c170
-rw-r--r--audio_codec/libfaad/ssr.h59
-rw-r--r--audio_codec/libfaad/ssr_fb.c191
-rw-r--r--audio_codec/libfaad/ssr_fb.h53
-rw-r--r--audio_codec/libfaad/ssr_ipqf.c171
-rw-r--r--audio_codec/libfaad/ssr_ipqf.h46
-rw-r--r--audio_codec/libfaad/ssr_win.h635
-rw-r--r--audio_codec/libfaad/structs.h513
-rw-r--r--audio_codec/libfaad/syntax.c2539
-rw-r--r--audio_codec/libfaad/syntax.h129
-rw-r--r--audio_codec/libfaad/tns.c304
-rw-r--r--audio_codec/libfaad/tns.h51
-rwxr-xr-xaudio_codec/libflac/Android.mk22
-rw-r--r--audio_codec/libflac/avcodec.h337
-rw-r--r--audio_codec/libflac/bswap.h94
-rw-r--r--audio_codec/libflac/codec.h36
-rw-r--r--audio_codec/libflac/codec_message.h109
-rw-r--r--audio_codec/libflac/common.h356
-rw-r--r--audio_codec/libflac/crc.c146
-rw-r--r--audio_codec/libflac/crc.h46
-rw-r--r--audio_codec/libflac/flac.c43
-rw-r--r--audio_codec/libflac/flac.h124
-rw-r--r--audio_codec/libflac/flac_decode.c943
-rw-r--r--audio_codec/libflac/flacdata.c38
-rw-r--r--audio_codec/libflac/flacdata.h29
-rw-r--r--audio_codec/libflac/get_bits.h564
-rw-r--r--audio_codec/libflac/golomb.h585
-rw-r--r--audio_codec/libflac/internal.h195
-rw-r--r--audio_codec/libflac/intreadwrite.h390
-rw-r--r--audio_codec/libflac/mathops.h78
-rw-r--r--audio_codec/libflac/types.h49
-rwxr-xr-xaudio_codec/liblpcm/Android.mk13
-rw-r--r--audio_codec/liblpcm/lpcm_decode.c437
-rwxr-xr-xaudio_codec/libmad/Android.mk13
-rwxr-xr-xaudio_codec/libmad/D.dat607
-rw-r--r--audio_codec/libmad/bit.c244
-rw-r--r--audio_codec/libmad/bit.h47
-rw-r--r--audio_codec/libmad/config.h133
-rw-r--r--audio_codec/libmad/decoder.c1102
-rw-r--r--audio_codec/libmad/decoder.h91
-rw-r--r--audio_codec/libmad/fixed.c85
-rw-r--r--audio_codec/libmad/fixed.h499
-rw-r--r--audio_codec/libmad/frame.c525
-rw-r--r--audio_codec/libmad/frame.h118
-rw-r--r--audio_codec/libmad/global.h58
-rw-r--r--audio_codec/libmad/huffman.c3109
-rw-r--r--audio_codec/libmad/huffman.h66
-rwxr-xr-xaudio_codec/libmad/imdct_l_arm.S1000
-rwxr-xr-xaudio_codec/libmad/imdct_s.dat62
-rw-r--r--audio_codec/libmad/layer12.c552
-rwxr-xr-xaudio_codec/libmad/layer12.h31
-rw-r--r--audio_codec/libmad/layer3.c2742
-rwxr-xr-xaudio_codec/libmad/layer3.h30
-rw-r--r--audio_codec/libmad/mad.h966
-rwxr-xr-xaudio_codec/libmad/qc_table.dat77
-rwxr-xr-xaudio_codec/libmad/rq_table.dat8747
-rwxr-xr-xaudio_codec/libmad/sf_table.dat106
-rw-r--r--audio_codec/libmad/stream.c185
-rw-r--r--audio_codec/libmad/stream.h111
-rw-r--r--audio_codec/libmad/synth.c921
-rw-r--r--audio_codec/libmad/synth.h69
-rw-r--r--audio_codec/libmad/timer.c493
-rw-r--r--audio_codec/libmad/timer.h100
-rw-r--r--audio_codec/libmad/version.c91
-rw-r--r--audio_codec/libmad/version.h47
-rwxr-xr-xaudio_codec/libpcm/Android.mk11
-rw-r--r--audio_codec/libpcm/intreadwrite.h390
-rw-r--r--audio_codec/libpcm/pcm_decode.c780
-rw-r--r--audio_codec/libraac/Android.mk51
-rw-r--r--audio_codec/libraac/aac_bitstream.c200
-rw-r--r--audio_codec/libraac/aac_bitstream.h133
-rw-r--r--audio_codec/libraac/aac_decode.h148
-rw-r--r--audio_codec/libraac/aac_decode_main.c396
-rw-r--r--audio_codec/libraac/aac_reorder.c85
-rw-r--r--audio_codec/libraac/aac_reorder.h53
-rw-r--r--audio_codec/libraac/aaccommon.h200
-rw-r--r--audio_codec/libraac/aacdec.c607
-rw-r--r--audio_codec/libraac/aacdec.h200
-rw-r--r--audio_codec/libraac/aactabs.c157
-rw-r--r--audio_codec/libraac/assembly.h147
-rw-r--r--audio_codec/libraac/bitstream.c451
-rw-r--r--audio_codec/libraac/bitstream.h76
-rw-r--r--audio_codec/libraac/buffers.c132
-rw-r--r--audio_codec/libraac/coder.h370
-rw-r--r--audio_codec/libraac/dct4.c339
-rw-r--r--audio_codec/libraac/decelmnt.c451
-rw-r--r--audio_codec/libraac/dequant.c382
-rw-r--r--audio_codec/libraac/fft.c393
-rw-r--r--audio_codec/libraac/filefmt.c531
-rw-r--r--audio_codec/libraac/ga_config.c209
-rw-r--r--audio_codec/libraac/ga_config.h86
-rw-r--r--audio_codec/libraac/huffman.c449
-rw-r--r--audio_codec/libraac/hufftabs.c177
-rw-r--r--audio_codec/libraac/imdct.c598
-rw-r--r--audio_codec/libraac/include/challenge.h132
-rw-r--r--audio_codec/libraac/include/codec_defines.h93
-rw-r--r--audio_codec/libraac/include/gecko2codec.h60
-rw-r--r--audio_codec/libraac/include/helix_config.h92
-rw-r--r--audio_codec/libraac/include/helix_mime_types.h56
-rw-r--r--audio_codec/libraac/include/helix_result.h107
-rw-r--r--audio_codec/libraac/include/helix_types.h305
-rw-r--r--audio_codec/libraac/include/helix_utils.h106
-rw-r--r--audio_codec/libraac/include/md5.h113
-rw-r--r--audio_codec/libraac/include/memory_utils.h58
-rw-r--r--audio_codec/libraac/include/pack_utils.h93
-rw-r--r--audio_codec/libraac/include/packet_defines.h48
-rw-r--r--audio_codec/libraac/include/ra8lbr_decode.h161
-rw-r--r--audio_codec/libraac/include/ra_backend.h94
-rw-r--r--audio_codec/libraac/include/ra_decode.h183
-rw-r--r--audio_codec/libraac/include/ra_depack.h177
-rw-r--r--audio_codec/libraac/include/ra_format_info.h60
-rw-r--r--audio_codec/libraac/include/rasl.h71
-rw-r--r--audio_codec/libraac/include/rdtpck.h153
-rw-r--r--audio_codec/libraac/include/rm_error.h54
-rw-r--r--audio_codec/libraac/include/rm_error_default.h53
-rw-r--r--audio_codec/libraac/include/rm_io_default.h49
-rw-r--r--audio_codec/libraac/include/rm_memory.h54
-rw-r--r--audio_codec/libraac/include/rm_memory_default.h46
-rw-r--r--audio_codec/libraac/include/rm_packet.h80
-rw-r--r--audio_codec/libraac/include/rm_parse.h302
-rw-r--r--audio_codec/libraac/include/rm_property.h107
-rw-r--r--audio_codec/libraac/include/rm_stream.h115
-rw-r--r--audio_codec/libraac/include/rm_stream_internal.h77
-rw-r--r--audio_codec/libraac/include/rv20backend.h69
-rw-r--r--audio_codec/libraac/include/rv30backend.h68
-rw-r--r--audio_codec/libraac/include/rv_backend.h84
-rw-r--r--audio_codec/libraac/include/rv_backend_types.h198
-rw-r--r--audio_codec/libraac/include/rv_decode.h208
-rw-r--r--audio_codec/libraac/include/rv_decode_message.h492
-rw-r--r--audio_codec/libraac/include/rv_depack.h162
-rw-r--r--audio_codec/libraac/include/rv_format_info.h91
-rw-r--r--audio_codec/libraac/include/statname.h118
-rw-r--r--audio_codec/libraac/include/stream_hdr_structs.h66
-rw-r--r--audio_codec/libraac/include/stream_hdr_utils.h77
-rw-r--r--audio_codec/libraac/include/string_utils.h62
-rw-r--r--audio_codec/libraac/include/tngpkt.h400
-rw-r--r--audio_codec/libraac/memory_utils.c100
-rw-r--r--audio_codec/libraac/noiseless.c503
-rw-r--r--audio_codec/libraac/pack_utils.c306
-rw-r--r--audio_codec/libraac/pns.c369
-rw-r--r--audio_codec/libraac/ra_depack.c230
-rw-r--r--audio_codec/libraac/ra_depack_internal.c1713
-rw-r--r--audio_codec/libraac/ra_depack_internal.h232
-rw-r--r--audio_codec/libraac/raac_decode.c854
-rw-r--r--audio_codec/libraac/raac_decode.h37
-rw-r--r--audio_codec/libraac/rm_error_default.c60
-rw-r--r--audio_codec/libraac/rm_io_default.c101
-rw-r--r--audio_codec/libraac/rm_memory_default.c54
-rw-r--r--audio_codec/libraac/rm_packet.c117
-rw-r--r--audio_codec/libraac/rm_parser.c649
-rw-r--r--audio_codec/libraac/rm_parser_internal.c3342
-rw-r--r--audio_codec/libraac/rm_parser_internal.h420
-rw-r--r--audio_codec/libraac/rm_property.c105
-rw-r--r--audio_codec/libraac/rm_stream.c356
-rw-r--r--audio_codec/libraac/rv_depack.c271
-rw-r--r--audio_codec/libraac/rv_depack_internal.c1071
-rw-r--r--audio_codec/libraac/rv_depack_internal.h171
-rw-r--r--audio_codec/libraac/sbr.c431
-rw-r--r--audio_codec/libraac/sbr.h381
-rwxr-xr-xaudio_codec/libraac/sbrcov.s164
-rw-r--r--audio_codec/libraac/sbrfft.c368
-rw-r--r--audio_codec/libraac/sbrfreq.c667
-rw-r--r--audio_codec/libraac/sbrhfadj.c877
-rw-r--r--audio_codec/libraac/sbrhfgen.c646
-rw-r--r--audio_codec/libraac/sbrhuff.c492
-rw-r--r--audio_codec/libraac/sbrimdct.c447
-rw-r--r--audio_codec/libraac/sbrmath.c198
-rw-r--r--audio_codec/libraac/sbrqmf.c643
-rwxr-xr-xaudio_codec/libraac/sbrqmfak.s182
-rwxr-xr-xaudio_codec/libraac/sbrqmfsk.s130
-rw-r--r--audio_codec/libraac/sbrside.c615
-rw-r--r--audio_codec/libraac/sbrtabs.c400
-rw-r--r--audio_codec/libraac/statname.h115
-rw-r--r--audio_codec/libraac/stproc.c252
-rw-r--r--audio_codec/libraac/stream_hdr_utils.c136
-rw-r--r--audio_codec/libraac/string_utils.c87
-rw-r--r--audio_codec/libraac/tns.c307
-rw-r--r--audio_codec/libraac/trigtabs.c1000
-rw-r--r--audio_codec/libraac/trigtabs_fltgen.c357
-rwxr-xr-xaudio_codec/wfd_aac_decoder/Android.mk23
-rw-r--r--audio_codec/wfd_aac_decoder/aaccommon.h210
-rw-r--r--audio_codec/wfd_aac_decoder/aacdec.c508
-rw-r--r--audio_codec/wfd_aac_decoder/aacdec.h206
-rw-r--r--audio_codec/wfd_aac_decoder/aactabs.c157
-rw-r--r--audio_codec/wfd_aac_decoder/assembly.h640
-rw-r--r--audio_codec/wfd_aac_decoder/assembly_mw.h743
-rw-r--r--audio_codec/wfd_aac_decoder/bitstream.c261
-rw-r--r--audio_codec/wfd_aac_decoder/bitstream.h74
-rw-r--r--audio_codec/wfd_aac_decoder/buffers.c140
-rw-r--r--audio_codec/wfd_aac_decoder/coder.h369
-rw-r--r--audio_codec/wfd_aac_decoder/dct4.c337
-rw-r--r--audio_codec/wfd_aac_decoder/decelmnt.c445
-rw-r--r--audio_codec/wfd_aac_decoder/dequant.c379
-rw-r--r--audio_codec/wfd_aac_decoder/fft.c391
-rw-r--r--audio_codec/wfd_aac_decoder/filefmt.c539
-rw-r--r--audio_codec/wfd_aac_decoder/helix_aac_decode.c548
-rw-r--r--audio_codec/wfd_aac_decoder/huffman.c450
-rw-r--r--audio_codec/wfd_aac_decoder/hufftabs.c177
-rw-r--r--audio_codec/wfd_aac_decoder/imdct.c596
-rw-r--r--audio_codec/wfd_aac_decoder/noiseless.c513
-rw-r--r--audio_codec/wfd_aac_decoder/pns.c371
-rw-r--r--audio_codec/wfd_aac_decoder/sbr.c434
-rw-r--r--audio_codec/wfd_aac_decoder/sbr.h380
-rw-r--r--audio_codec/wfd_aac_decoder/sbrfft.c368
-rw-r--r--audio_codec/wfd_aac_decoder/sbrfreq.c673
-rw-r--r--audio_codec/wfd_aac_decoder/sbrhfadj.c882
-rw-r--r--audio_codec/wfd_aac_decoder/sbrhfgen.c655
-rw-r--r--audio_codec/wfd_aac_decoder/sbrhuff.c494
-rw-r--r--audio_codec/wfd_aac_decoder/sbrimdct.c447
-rw-r--r--audio_codec/wfd_aac_decoder/sbrmath.c198
-rw-r--r--audio_codec/wfd_aac_decoder/sbrqmf.c648
-rw-r--r--audio_codec/wfd_aac_decoder/sbrside.c634
-rw-r--r--audio_codec/wfd_aac_decoder/sbrtabs.c400
-rw-r--r--audio_codec/wfd_aac_decoder/statname.h115
-rw-r--r--audio_codec/wfd_aac_decoder/stproc.c251
-rw-r--r--audio_codec/wfd_aac_decoder/tns.c307
-rw-r--r--audio_codec/wfd_aac_decoder/trigtabs.c1000
-rw-r--r--audio_codec/wfd_aac_decoder/trigtabs_fltgen.c357
545 files changed, 230976 insertions, 0 deletions
diff --git a/amadec/audio_out/android-out.cpp b/amadec/audio_out/android-out.cpp
new file mode 100755
index 0000000..d380ca3
--- a/dev/null
+++ b/amadec/audio_out/android-out.cpp
@@ -0,0 +1,1640 @@
+/**
+ * \file android-out.cpp
+ * \brief Functions of Auduo output control for Android Platform
+ * \version 1.0.0
+ * \date 2011-03-08
+ */
+/* Copyright (C) 2007-2011, Amlogic Inc.
+ * All right reserved
+ *
+ */
+#include <utils/RefBase.h>
+#include <utils/KeyedVector.h>
+#include <utils/threads.h>
+#include <media/AudioSystem.h>
+#include <media/AudioTrack.h>
+#include <binder/IPCThreadState.h>
+#include <binder/ProcessState.h>
+#include <media/AudioParameter.h>
+#include <system/audio_policy.h>
+#include <cutils/properties.h>
+
+extern "C" {
+#include <audio-dec.h>
+#include <adec-pts-mgt.h>
+#include <log-print.h>
+#include "aml_resample.h"
+#include <audiodsp_update_format.h>
+#include <Amsysfsutils.h>
+#include <amthreadpool.h>
+}
+#include "adec-external-ctrl.h"
+namespace android
+{
+
+#if ANDROID_PLATFORM_SDK_VERSION >= 21
+//android 5.0 level= 20
+#define AUDIO_FORMAT_EAC3 AUDIO_FORMAT_E_AC3
+#endif
+#if ANDROID_PLATFORM_SDK_VERSION >= 23
+#define AUDIO_FORMAT_DTS_MASTER 0x0E000000UL
+#endif
+#define DOLBY_SYSTEM_CHANNEL "ds1.audio.multichannel.support"
+static Mutex mLock;
+static Mutex mLock_raw;
+//get default output sample rate which maybe changed by raw output
+static int default_sr = 48000;
+static int fill_audiotrack_zero = 0;
+static int buffering_audio_data = 0;
+static int skip_unnormal_discontinue = 0;
+static int unnormal_discontinue = 0;
+static int unnormal_discontinue1 = 0;
+extern "C" int get_audio_decoder(void);
+static int get_digitalraw_mode(void)
+{
+ return amsysfs_get_sysfs_int("/sys/class/audiodsp/digital_raw");
+}
+#define DTSETC_DECODE_VERSION_CORE 350
+#define DTSETC_DECODE_VERSION_M6_M8 380
+#define DTSHD_IEC958_PKTTYPE_CORE 0 //common feature for DTSETC_DECODE_VERSION 350/380,so set it to 0 by default
+#define DTSHD_IEC958_PKTTYPE_SINGLEI2S 1
+#define DTSHD_IEC958_PKTTYPE_FOURI2S 2
+
+void restore_system_samplerate(struct aml_audio_dec* audec)
+{
+#if defined(ANDROID_VERSION_JBMR2_UP)
+ unsigned int sr = 0;
+#else
+ int sr = 0;
+#endif
+ if( audec->format == ACODEC_FMT_TRUEHD ||
+ (audec->format==ACODEC_FMT_DTS && audec->VersionNum==DTSETC_DECODE_VERSION_M6_M8 && audec->DTSHDIEC958_FS>192000 && amsysfs_get_sysfs_int("/sys/class/audiodsp/digital_raw")==2))
+ {
+ ;//do nothing
+ }else if(audec->samplerate == 48000 || (audec->format != ACODEC_FMT_DTS && \
+ audec->format != ACODEC_FMT_AC3 && audec->format != ACODEC_FMT_EAC3 &&
+ audec->format != ACODEC_FMT_TRUEHD))
+ return ;
+ audio_io_handle_t handle = -1;
+//for mx, raw/pcm use the same audio hal
+#ifndef USE_ARM_AUDIO_DEC
+ handle = AudioSystem::getOutput(AUDIO_STREAM_MUSIC,
+ 48000,
+ AUDIO_FORMAT_PCM_16_BIT,
+ AUDIO_CHANNEL_OUT_STEREO,
+#if defined(_VERSION_ICS)
+ AUDIO_POLICY_OUTPUT_FLAG_INDIRECT
+#else //JB...
+ AUDIO_OUTPUT_FLAG_PRIMARY
+#endif
+ );
+ if(handle > 0){
+ char str[64];
+ memset(str,0,sizeof(str));
+ sprintf(str,"sampling_rate=%d",default_sr);
+ AudioSystem::setParameters(handle, String8(str));
+ }
+#else
+//for M8, raw/pcm output use different HAL, so only check the raw output device
+ handle = AudioSystem::getOutput(AUDIO_STREAM_MUSIC,
+ 48000,
+ AUDIO_FORMAT_AC3, //use AC3 as the format tag for all raw output
+ AUDIO_CHANNEL_OUT_STEREO,
+#if defined(_VERSION_ICS)
+ AUDIO_POLICY_OUTPUT_FLAG_INDIRECT
+#else //JB...
+ AUDIO_OUTPUT_FLAG_DIRECT
+#endif
+ );
+
+ if(handle > 0){
+ char str[64];
+ memset(str,0,sizeof(str));
+ sprintf(str,"sampling_rate=%d",default_sr);
+ AudioSystem::setParameters(handle, String8(str));
+#if ANDROID_PLATFORM_SDK_VERSION >= 22
+ AudioSystem::releaseOutput(handle, AUDIO_STREAM_DEFAULT, AUDIO_SESSION_OUTPUT_STAGE);
+#else
+ AudioSystem::releaseOutput(handle);
+#endif
+ }else{
+ adec_print("WARNIN: handle/%d resetore sysFs failed!\n",handle);
+ }
+#endif
+}
+
+#if defined(ANDROID_VERSION_JBMR2_UP)
+static size_t old_frame_count = 0;
+#else
+static int old_frame_count = 0;
+#endif
+
+void restore_system_framesize()
+{
+ if(old_frame_count == 0){
+ adec_print("frame size can't be zero !\n");
+ return;
+ }
+ adec_print("restore system frame size\n");
+ int sr = 0;
+ audio_io_handle_t handle = -1;
+ handle = AudioSystem::getOutput(AUDIO_STREAM_MUSIC,
+ 48000,
+ AUDIO_FORMAT_PCM_16_BIT,
+ AUDIO_CHANNEL_OUT_STEREO,
+#if defined(_VERSION_ICS)
+ AUDIO_POLICY_OUTPUT_FLAG_INDIRECT
+#else //JB...
+ AUDIO_OUTPUT_FLAG_PRIMARY
+#endif
+ );
+ if(handle > 0){
+ char str[64];
+ int ret;
+ memset(str,0,sizeof(str));
+#if defined(ANDROID_VERSION_JBMR2_UP)
+ sprintf(str,"frame_count=%zd",old_frame_count);
+ ret = AudioSystem::setParameters(handle, String8(str));
+ adec_print("restore frame success: %zd\n", old_frame_count);
+#else
+ sprintf(str,"frame_count=%zd",old_frame_count);
+ ret = AudioSystem::setParameters(handle, String8(str));
+ adec_print("restore frame success: %zd\n", old_frame_count);
+#endif
+ }
+}
+
+void reset_system_samplerate(struct aml_audio_dec* audec)
+{
+ unsigned digital_raw = 0;
+ audio_io_handle_t handle = -1;
+ int dtsFS_88_96_Directout=0;
+ digital_raw = get_digitalraw_mode();
+ if(audec->format == ACODEC_FMT_DTS && audec->samplerate>48000 && !digital_raw)
+ {
+ char tmp[128]={0};
+ if(property_get("media.libplayer.88_96K", tmp, "0") > 0 && !strcmp(tmp, "1"))
+ dtsFS_88_96_Directout=1;
+ }
+ if(!audec || (!digital_raw && audec->channels!=8 && !dtsFS_88_96_Directout))
+ return;
+ /*
+ 1)32k,44k dts
+ 2) 32k,44k ac3
+ 3)44.1k eac3 when hdmi passthrough
+ 4)32k,44k eac3 when spdif pasthrough
+ */
+ adec_print("[%s %d]format %d,audec->samplerate%d DTSHDIEC958_FS/%d\n",__FUNCTION__,__LINE__,audec->format ,audec->samplerate,audec->DTSHDIEC958_FS );
+ int Samplerate=audec->samplerate;
+ int dts_raw_reset_sysFS=0;
+ if( (audec->format == ACODEC_FMT_DTS && digital_raw==1)
+ ||(audec->format == ACODEC_FMT_DTS && digital_raw==2 && audec->VersionNum!=DTSETC_DECODE_VERSION_M6_M8)
+ ||(audec->format == ACODEC_FMT_DTS && digital_raw==2 && audec->VersionNum==DTSETC_DECODE_VERSION_M6_M8 && audec->DTSHDIEC958_PktType==DTSHD_IEC958_PKTTYPE_CORE)
+ )
+ { //DTS raw_stream Directoutput
+ if(audec->samplerate%48000!=0)
+ dts_raw_reset_sysFS=1;
+ if(audec->samplerate==32000 || audec->samplerate==44100)
+ Samplerate=audec->samplerate;
+ else if(audec->samplerate==88200 || audec->samplerate==96000)
+ Samplerate=audec->samplerate/2;
+ else if(audec->samplerate==176400 || audec->samplerate==192000)
+ Samplerate=audec->samplerate/4;
+ else{
+ adec_print("[%s %d] Unvalid samplerate/%d for DTSCore Rawoutput\n",__FUNCTION__,__LINE__,audec->samplerate);
+ return;
+ }
+ }else if(audec->format == ACODEC_FMT_DTS && digital_raw==2 && audec->VersionNum==DTSETC_DECODE_VERSION_M6_M8 && audec->DTSHDIEC958_PktType==DTSHD_IEC958_PKTTYPE_SINGLEI2S){
+ //DTSHD SingleI2s raw_stream Directoutput
+ if(audec->DTSHDIEC958_FS==48000||audec->DTSHDIEC958_FS==44100)
+ {
+ Samplerate=audec->DTSHDIEC958_FS;
+ }else if(audec->DTSHDIEC958_FS==192000||audec->DTSHDIEC958_FS==1764000){
+ Samplerate =audec->DTSHDIEC958_FS/4;
+ }else{
+ adec_print("[%s %d] Unvalid DTSHDIEC958_FS/%d for DTSHD RawOutput\n",__FUNCTION__,__LINE__,audec->DTSHDIEC958_FS);
+ return;
+ }
+ if(Samplerate%48000!=0)
+ dts_raw_reset_sysFS=1;
+ }else if(audec->format==ACODEC_FMT_DTS && digital_raw==2&& audec->VersionNum==DTSETC_DECODE_VERSION_M6_M8&& audec->DTSHDIEC958_PktType==DTSHD_IEC958_PKTTYPE_FOURI2S){
+ //DTSLL FourI2s raw_stream Directoutput
+ if(audec->DTSHDIEC958_FS==192000||audec->DTSHDIEC958_FS==384000 || audec->DTSHDIEC958_FS==768000 ||
+ audec->DTSHDIEC958_FS==176400||audec->DTSHDIEC958_FS==352800 || audec->DTSHDIEC958_FS==705600)
+ {
+ Samplerate=audec->DTSHDIEC958_FS/4;
+ }else{
+ adec_print("[%s %d] Unvalid DTSHDIEC958_FS/%d for DTSLL RawOutput\n",__FUNCTION__,__LINE__,audec->DTSHDIEC958_FS);
+ return;
+ }
+ if(Samplerate!=48000)
+ dts_raw_reset_sysFS=1;
+ }else if(audec->format == ACODEC_FMT_DTS&& (audec->samplerate>48000|| (audec->channels==8&&audec->samplerate!=48000))){
+ //DTS HD_PCM(FS>48000) Directoutput/8ch DTS_PCM output
+ dts_raw_reset_sysFS=1;
+ Samplerate=audec->samplerate;
+ }else if(audec->format == ACODEC_FMT_TRUEHD && (digital_raw == 1 || digital_raw == 2)){
+ //Dobly TrueHD RawOutput
+ Samplerate = 192000;
+ }
+ if( (audec->format == ACODEC_FMT_AC3 && (audec->samplerate == 32000 || audec->samplerate == 44100))
+ ||(audec->format == ACODEC_FMT_EAC3 && digital_raw == 2 && audec->samplerate == 44100)
+ ||(audec->format == ACODEC_FMT_EAC3 && digital_raw == 1 && (audec->samplerate == 32000 || audec->samplerate == 44100))
+ || dts_raw_reset_sysFS
+ ||(audec->format == ACODEC_FMT_TRUEHD && (digital_raw == 1 || digital_raw == 2)/* &&
+ (audec->samplerate == 192000 || audec->samplerate == 96000)*/))
+
+ {
+ adec_print("[%s %d]Change AudioSysFS to/%d\n",__FUNCTION__,__LINE__,Samplerate);
+ int sr = 0;
+ if(/*sr*/48000 != Samplerate){
+#ifndef USE_ARM_AUDIO_DEC
+ handle = AudioSystem::getOutput(AUDIO_STREAM_MUSIC,
+ 48000,
+ AUDIO_FORMAT_PCM_16_BIT,
+ AUDIO_CHANNEL_OUT_STEREO,
+#if defined(_VERSION_ICS)
+ AUDIO_POLICY_OUTPUT_FLAG_INDIRECT
+#else //JB...
+ AUDIO_OUTPUT_FLAG_PRIMARY
+#endif
+ );
+ if(handle > 0){
+ char str[64];
+ memset(str,0,sizeof(str));
+ sprintf(str,"sampling_rate=%d",audec->samplerate);
+ AudioSystem::setParameters(handle, String8(str));
+ }
+#else
+ //for M8, raw/pcm output use different HAL, so only check the raw output device
+ handle = AudioSystem::getOutput(AUDIO_STREAM_MUSIC,
+ 48000,
+ AUDIO_FORMAT_AC3, //use AC3 as the format tag for all raw output
+ AUDIO_CHANNEL_OUT_STEREO,
+#if defined(_VERSION_ICS)
+ AUDIO_POLICY_OUTPUT_FLAG_INDIRECT
+#else //JB...
+ AUDIO_OUTPUT_FLAG_DIRECT
+#endif
+ );
+
+ if(handle > 0){
+ char str[64];
+ memset(str,0,sizeof(str));
+ sprintf(str,"sampling_rate=%d",Samplerate);
+ AudioSystem::setParameters(handle, String8(str));
+#if ANDROID_PLATFORM_SDK_VERSION >= 22
+ AudioSystem::releaseOutput(handle, AUDIO_STREAM_DEFAULT, AUDIO_SESSION_OUTPUT_STAGE);
+#else
+ AudioSystem::releaseOutput(handle);
+#endif
+ }else{
+ adec_print("WARNIN:handle/%d reset sysFs failed!\n",handle);
+ }
+#endif
+
+ }
+
+
+ }
+}
+
+/**
+ * \brief callback function invoked by android
+ * \param event type of event notified
+ * \param user pointer to context for use by the callback receiver
+ * \param info pointer to optional parameter according to event type
+ */
+
+#define AMSTREAM_IOC_MAGIC 'S'
+#define AMSTREAM_IOC_GET_LAST_CHECKIN_APTS _IOR(AMSTREAM_IOC_MAGIC, 0xa9, unsigned long)
+#define AMSTREAM_IOC_GET_LAST_CHECKIN_VPTS _IOR(AMSTREAM_IOC_MAGIC, 0xaa, unsigned long)
+#define AMSTREAM_IOC_GET_LAST_CHECKOUT_APTS _IOR(AMSTREAM_IOC_MAGIC, 0xab, unsigned long)
+#define AMSTREAM_IOC_GET_LAST_CHECKOUT_VPTS _IOR(AMSTREAM_IOC_MAGIC, 0xac, unsigned long)
+#define AMSTREAM_IOC_AB_STATUS _IOR(AMSTREAM_IOC_MAGIC, 0x09, int)
+
+static unsigned long long ttt = 0;
+
+static int resample = 0, last_resample = 0, resample_step = 0, last_step=0;
+static int xxx;
+static int diff_record[0x40], diff_wp = 0;
+static int wfd_enable = 0, bytes_skipped = 0x7fffffff;
+static int wfd_ds_thrdhold = 250; //audio pts delay threadhold for down sampling
+static int wfd_us_thrdhold = 150;//audio pts delay threadhold for up sampling
+
+#if ANDROID_PLATFORM_SDK_VERSION >= 19
+static sp<AudioTrack> mpAudioTrack;
+static sp<AudioTrack> mpAudioTrack_raw;
+#endif
+
+struct buf_status {
+ int size;
+ int data_len;
+ int free_len;
+ unsigned int read_pointer;
+ unsigned int write_pointer;
+};
+
+struct am_io_param {
+ int data;
+ int len; //buffer size;
+ struct buf_status status;
+};
+
+static int mix_lr_channel_enable=0;
+static int pre_gain_enable=0;
+static void momo2_mode_mix(short*buf, int nsamps, int channels)
+{
+ int i;
+ int step=4;//assume deffault pcm format: bitwidth/2bytes channels/2
+ short tmpL,tmpR;
+ int tmpSum;
+ short *p16tmp=(short*)buf;
+ if(channels!=2)
+ return;
+ for(i=0;i<nsamps;i+=2)
+ {
+ tmpSum=(p16tmp[i]*3/4)+(p16tmp[i+1]*3/4);
+ tmpSum=tmpSum>32767 ?32767 : tmpSum;
+ tmpSum=tmpSum<-32768?-32768: tmpSum;
+ p16tmp[i]=(tmpSum&0x0000ffff);
+ p16tmp[i+1]=(tmpSum&0x0000ffff);
+ }
+}
+
+static void apply_audio_pregain(void *buf, int size, float gain) {
+ int i;
+ short *sample = (short*)buf;
+ for (i = 0; i < size/sizeof(short); i++)
+ sample[i] = gain*sample[i];
+}
+
+#define RESAMPLE_THRESHOLD (30 * TIME_UNIT90K / 1000)
+void audioCallback(int event, void* user, void *info)
+{
+ int len, i;
+ unsigned last_checkin, last_checkout;
+ unsigned diff, diff_avr;
+ AudioTrack::Buffer *buffer = static_cast<AudioTrack::Buffer *>(info);
+ aml_audio_dec_t *audec = static_cast<aml_audio_dec_t *>(user);
+ audio_out_operations_t *out_ops = &audec->aout_ops;
+ dsp_operations_t *dsp_ops = &audec->adsp_ops;
+ unsigned long apts, pcrscr;
+ struct am_io_param am_io;
+
+ if (event != AudioTrack::EVENT_MORE_DATA) {
+ //adec_refresh_pts(audec);
+ adec_print(" ****************** audioCallback: event = %d g_bst->buf_level/%d g_bst_raw->buf_level/%d [-1:mean unknown] \n", event,audec->g_bst==NULL?-1:audec->g_bst->buf_level,audec->g_bst_raw==NULL?-1:audec->g_bst_raw->buf_level);
+ return;
+ }
+
+ if (buffer == NULL || buffer->size == 0) {
+ adec_print("audioCallback: Wrong buffer\n");
+ return;
+ }
+
+ if(wfd_enable){
+ ioctl(audec->adsp_ops.amstream_fd, AMSTREAM_IOC_GET_LAST_CHECKIN_APTS, &last_checkin);
+ last_checkout = dsp_ops->get_cur_pts(dsp_ops);
+ if(last_checkin < last_checkout){
+ diff = 0;
+ }else{
+ diff = (last_checkin-last_checkout)/90;
+ }
+
+ //ioctl(audec->adsp_ops.amstream_fd, AMSTREAM_IOC_GET_LAST_CHECKOUT_APTS, (int)&last_checkout);
+ }
+ if(wfd_enable){
+ // filtering
+ diff_record[diff_wp++] = diff;
+ diff_wp = diff_wp & 0x3f;
+
+ diff_avr = 0;
+ for (i=0;i<0x40;i++) diff_avr+=diff_record[i];
+ diff_avr = diff_avr / 0x40;
+
+ // if ((xxx++ % 30) == 0)
+ // adec_print("audioCallback start: request %d, in: %d, out: %d, diff: %d, filtered: %d",buffer->size, last_checkin/90, last_checkout/90, diff, diff_avr);
+ if(bytes_skipped == 0 && diff < 200){
+ if(dsp_ops->set_skip_bytes)
+ dsp_ops->set_skip_bytes(&audec->adsp_ops, 0x7fffffff);
+ bytes_skipped = 0x7fffffff;
+ }
+
+ if(diff >1000){ // too much data in audiobuffer,should be skipped
+ if(dsp_ops->set_skip_bytes)
+ dsp_ops->set_skip_bytes(&audec->adsp_ops, 0);
+ bytes_skipped = 0;
+ adec_print("skip more data: last_checkin[%d]-last_checkout[%d]=%d, diff=%d\n", last_checkin/90, last_checkout/90, (last_checkin-last_checkout)/90, diff);
+ }
+
+ if (diff_avr > /*220*/wfd_ds_thrdhold) {
+ resample = 1; resample_step = 2;
+ } else if (diff_avr</*180*/wfd_us_thrdhold) {
+ // once we see a single shot of low boundry we finish down-sampling
+ resample = 1; resample_step = -2;
+ }else if(resample && (diff_avr < 200)){
+ resample = 0;
+ }
+
+ if (last_resample != resample || last_step != resample_step) {
+ last_resample = resample;
+ last_step = resample_step;
+ adec_print("resample changed to %d, step=%d, diff = %d", resample, resample_step,diff_avr);
+ }
+ }
+#if 1
+ if (audec->tsync_mode == TSYNC_MODE_PCRMASTER && audec->pcrtsync_enable) {
+ if (audec->adis_flag <= 0) {
+ unsigned long apts, pcrscr;
+ int64_t apts64, pcrscr64;
+
+ apts64 = audec->apts64;
+ pcrscr64 = audec->pcrscr64;
+
+ if (apts64 && pcrscr64 && (abs(apts64 - pcrscr64) <= 90000*60*10)) {
+ ioctl(audec->adsp_ops.amstream_fd, AMSTREAM_IOC_AB_STATUS, (unsigned long)&am_io);
+ //adec_print("ab_level=%x, ab_rd_ptr=%x", am_io.status.data_len, am_io.status.read_pointer);
+
+ if (abs(apts64 - pcrscr64) >= 90000*30 && unnormal_discontinue < 400) { // avoid replay apts would be pause
+ unnormal_discontinue++;
+ skip_unnormal_discontinue = 0;
+ unnormal_discontinue1 = 0;
+ } else if (abs(apts64 - pcrscr64) < 90000*30 && abs(apts64 - pcrscr64) >= 90000*3 && unnormal_discontinue1 < 200) {
+ unnormal_discontinue1 ++;
+ unnormal_discontinue = 0;
+ skip_unnormal_discontinue = 0;
+ }
+ //if (((apts64 - pcrscr64) > (int64_t)(audec->fill_trackzero_thrsh)) ||((apts64 > pcrscr64) && (am_io.status.data_len < 0x200))) {
+ if ((apts64 - pcrscr64) > (int64_t)(audec->fill_trackzero_thrsh)) {
+ adec_print("[%s:%d] %d, thrsh:%d, apts64:%lld, pcrscr64:%lld, diff:%lld, lastapts:%lx, pcmsize:%d, abuffer_lv:0x%x\n",
+ __FUNCTION__, __LINE__, fill_audiotrack_zero, audec->fill_trackzero_thrsh,apts64, pcrscr64, apts64-pcrscr64,audec->adsp_ops.last_audio_pts,buffer->size, am_io.status.data_len);
+ if (skip_unnormal_discontinue++ > 10) {
+ memset((char*)(buffer->i16), 0, buffer->size);
+ if (!fill_audiotrack_zero) {
+ adec_pts_pause();
+ }
+ fill_audiotrack_zero = audec->fill_trackzero_thrsh/(20*90);
+ adec_print("[%s:%d] %d, thrsh:%d, apts64:%lld, pcrscr64:%lld, diff:%lld, lastapts:%lx, pcmsize:%d, abuffer_lv:0x%x\n",
+ __FUNCTION__, __LINE__, fill_audiotrack_zero, audec->fill_trackzero_thrsh,apts64, pcrscr64, apts64-pcrscr64,audec->adsp_ops.last_audio_pts,buffer->size, am_io.status.data_len);
+ return;
+ }
+ } else {
+ if (skip_unnormal_discontinue>0) {
+ adec_print("[%s:%d], skip_unnormal_discontinue:%d, fill_audiotrack_zero:%d, apts-pcr:%lld, ---------------------------\n",__FUNCTION__, __LINE__, skip_unnormal_discontinue,fill_audiotrack_zero,apts64 - pcrscr64);
+ skip_unnormal_discontinue = 0;
+ }
+ unnormal_discontinue = 0;
+ unnormal_discontinue1 = 0;
+ }
+ if ((fill_audiotrack_zero > 0) && ((apts64 - pcrscr64) > (int64_t)(70*TIME_UNIT90K/1000))) {
+ fill_audiotrack_zero--;
+
+ if (!fill_audiotrack_zero) {
+ adec_pts_resume();
+ skip_unnormal_discontinue = 0;
+ unnormal_discontinue = 0;
+ unnormal_discontinue1 = 0;
+ }
+
+ memset((char*)(buffer->i16), 0, buffer->size);
+ adec_print("## %d, %d, apts bigger than pcr, 2222 apts64:%lld, pcrscr64:%lld, diff:%lld, \n", fill_audiotrack_zero, buffering_audio_data, apts64, pcrscr64, apts64-pcrscr64);
+ return;
+ } else {
+ if (fill_audiotrack_zero > 0 && ((apts64 - pcrscr64) <= (int64_t)(70*TIME_UNIT90K/1000))
+ && ((apts64 - pcrscr64) > 0)) {
+ fill_audiotrack_zero = 0;
+ adec_pts_resume();
+ skip_unnormal_discontinue = 0;
+ unnormal_discontinue = 0;
+ unnormal_discontinue1 = 0;
+ adec_print("[%s:%d], fill enough! ---------------------------\n",__FUNCTION__, __LINE__);
+ }
+ }
+
+ if (audec->apts64 - audec->last_apts64 > RESAMPLE_THRESHOLD) {
+ int64_t diff_discontinue = abs(pcrscr64 - apts64);
+ if (diff_discontinue > (int64_t)(TIME_UNIT90K * 3)) {
+ adec_print("discontinue: #pcrmaster: %lld, %lld, %lld, %d,%d,--------\n", apts64, pcrscr64,
+ apts64 - pcrscr64, RESAMPLE_THRESHOLD, ((pcrscr64 - apts64) > (int64_t)(100 * TIME_UNIT90K / 1000)));
+ af_set_resample_type(RESAMPLE_TYPE_NONE);
+ } else if ((pcrscr64 - apts64) > (int64_t)RESAMPLE_THRESHOLD) {
+ af_set_resample_type(RESAMPLE_TYPE_DOWN);
+ adec_print("down: #pcrmaster enable:%d, %lld, %lld, %lld, --------\n", af_get_resample_enable_flag(),apts64,pcrscr64,pcrscr64-apts64);
+ } else if ((apts64 - pcrscr64) > (int64_t)RESAMPLE_THRESHOLD) {
+ af_set_resample_type(RESAMPLE_TYPE_UP);
+ adec_print("up: #pcrmaster enable:%d, %lld, %lld, %lld, --------\n", af_get_resample_enable_flag(), apts64,pcrscr64,apts64-pcrscr64);
+ } else {
+ adec_print("none: #pcrmaster: %lld, %lld, %lld, %d,%d,--------\n",
+ apts64,pcrscr64,apts64-pcrscr64,RESAMPLE_THRESHOLD,((pcrscr64 - apts64) > (int64_t)(100*TIME_UNIT90K/1000)));
+ af_set_resample_type(RESAMPLE_TYPE_NONE);
+ }
+ audec->last_apts64 = apts64;
+ }
+ }
+ } else {
+ audec->adis_flag--;
+ adec_print("[%s:%d], pcr:%llx, apts:%llx, tsync_pcr_dispoint:%llx, adis_flag:%d,-------------\n",__FUNCTION__, __LINE__,
+ audec->pcrscr64, audec->apts64, audec->tsync_pcr_dispoint,audec->adis_flag);
+ }
+ }
+#endif
+ if (audec->adsp_ops.dsp_on) {
+ int channels;
+ #if ANDROID_PLATFORM_SDK_VERSION >= 19
+ channels = mpAudioTrack->channelCount();
+ #elif defined(ANDROID_VERSION_JBMR2_UP)
+ AudioTrack *track = (AudioTrack *)out_ops->private_data;
+ channels = track->channelCount();
+ #else
+ channels = buffer->channelCount;
+ #endif
+ if (wfd_enable) {
+ af_resample_api((char*)(buffer->i16), (unsigned int*)&buffer->size, channels, audec, resample, resample_step);
+ } else if (audec->tsync_mode == TSYNC_MODE_PCRMASTER) {
+ af_pcrmaster_resample_api((char*)(buffer->i16), (unsigned int*)&buffer->size, channels, audec);
+ } else {
+ af_resample_api_normal((char*)(buffer->i16), (unsigned int*)&buffer->size, channels, audec);
+ }
+ if (!audec->pre_mute) {
+ if (audec->pre_gain_enable >= 0) {
+ pre_gain_enable = audec->pre_gain_enable;
+ }
+ if (pre_gain_enable) {
+ apply_audio_pregain(buffer->i16, buffer->size, audec->pre_gain);
+ }
+ if (audec->mix_lr_channel_enable >= 0)
+ mix_lr_channel_enable = audec->mix_lr_channel_enable;
+ if (mix_lr_channel_enable && channels == 2) {
+ momo2_mode_mix((short*)(buffer->i16), buffer->size/2,channels);
+ }
+ } else {
+ //mute the buffer by pre-mute flag on
+ memset(buffer->i16, 0, buffer->size);
+ }
+ } else {
+ adec_print("audioCallback: dsp not work!\n");
+ }
+
+
+ if(wfd_enable){
+ if (buffer->size==0) {
+ adec_print("no sample from DSP !!! in: %d, out: %d, diff: %d, filtered: %d", last_checkin/90, last_checkout/90, (last_checkin-last_checkout)/90, diff_avr);
+
+ ioctl(audec->adsp_ops.amstream_fd, AMSTREAM_IOC_AB_STATUS, (unsigned long)&am_io);
+ if (am_io.status.size > 0)
+ adec_print("ab_level=%x,ab_size=%x, alevel:%f, ab_rd_ptr=%x",
+ am_io.status.data_len, am_io.status.size, (float)(am_io.status.data_len)/(am_io.status.size), am_io.status.read_pointer);
+ }
+ }
+ return;
+}
+#ifdef USE_ARM_AUDIO_DEC
+//-------------------------------------------------------------------------
+static void i2s_iec958_sync_force(struct aml_audio_dec* audec,int bytes_readed_diff_allowd)
+{
+ int bytes_err= audec->raw_bytes_readed-audec->pcm_bytes_readed*audec->codec_type;
+ int bytes_cnt;
+ int len;
+ int goon_read_data_flag=1;
+ char tmp[2048];
+ int64_t tmp64;
+ #if 0
+ if(-bytes_err>bytes_readed_diff_allowd)
+ {
+ //958 is lower than i2s :so we discard data
+ bytes_err=-bytes_err;
+ int raw_size_discard=bytes_err-bytes_readed_diff_allowd;
+ bytes_cnt=0;
+ while(bytes_cnt<raw_size_discard && !audec->need_stop){
+ len=audec->adsp_ops.dsp_read_raw(&audec->adsp_ops,tmp,(raw_size_discard-bytes_cnt)>2048?2048:(raw_size_discard-bytes_cnt));
+ bytes_cnt+=len;
+ if (len=0)
+ break;
+ }
+ audec->raw_bytes_readed+=bytes_cnt;
+ }else if(bytes_err>bytes_readed_diff_allowd){
+ //958 is faster than i2s
+ int pcm_size_discard=(bytes_err-bytes_readed_diff_allowd)/audec->codec_type;
+ bytes_cnt=0;
+ while(bytes_cnt<pcm_size_discard && !audec->need_stop){
+ len=audec->adsp_ops.dsp_read(&audec->adsp_ops,tmp,(pcm_size_discard-bytes_cnt)>2048?2048:(pcm_size_discard-bytes_cnt));
+ bytes_cnt+=len;
+ if (len=0)
+ break;
+ }
+ audec->pcm_bytes_readed+=bytes_cnt;
+ }
+ #endif
+ tmp64=audec->pcm_bytes_readed>audec->raw_bytes_readed? audec->raw_bytes_readed:audec->pcm_bytes_readed;
+ audec->pcm_bytes_readed -=tmp64;
+ audec->raw_bytes_readed -=tmp64;
+};
+void audioCallback_raw(int event, void* user, void *info)
+{
+ int len;
+ AudioTrack::Buffer *buffer = static_cast<AudioTrack::Buffer *>(info);
+ aml_audio_dec_t *audec = static_cast<aml_audio_dec_t *>(user);
+ if (event != AudioTrack::EVENT_MORE_DATA) {
+ adec_print("[%s %d]audioCallback: event = %d \n",__FUNCTION__,__LINE__, event);
+ return;
+ }
+ if (buffer == NULL || buffer->size == 0) {
+ adec_print("[%s %d]audioCallback: Wrong buffer\n",__FUNCTION__,__LINE__);
+ return;
+ }
+
+ if(audec->i2s_iec958_sync_flag && audec->raw_bytes_readed< audec->i2s_iec958_sync_gate)
+ { char tmp[4096];
+ int readed_bytes=0;
+ int bytes_readed_diff=audec->raw_bytes_readed-audec->pcm_bytes_readed*audec->codec_type;
+ if(bytes_readed_diff==0){
+ //adec_print("NOTE: bytes_readed_diff/0 audec->pcm_bytes_readed/%d\n",audec->pcm_bytes_readed);
+ while(audec->pcm_bytes_readed==0 && !audec->need_stop){
+ amthreadpool_thread_usleep(2000);
+ }
+ adec_print("NOTE:i2s has started read pcm\n");
+ }
+
+ bytes_readed_diff=audec->raw_bytes_readed-audec->pcm_bytes_readed*audec->codec_type;
+ if(bytes_readed_diff>0){//iec958 was faster than i2s:
+ //adec_print("Iec958 faster than I2s: bytes_readed_diff/%d (SyncGate/%d RawBytesReaded/%lld PcmBytesReaded/%lld codec_type/%f)\n",
+ // bytes_readed_diff,audec->i2s_iec958_sync_gate,audec->raw_bytes_readed,audec->pcm_bytes_readed,audec->codec_type);
+ buffer->size /=8;
+ buffer->size-= (buffer->size%audec->raw_frame_size);
+ memset((char*)(buffer->i16),0,buffer->size);
+ return;
+ }else if(bytes_readed_diff<0){//iec958 was slower than i2s:
+ while((audec->raw_bytes_readed-audec->pcm_bytes_readed*audec->codec_type)<0 &&
+ (audec->raw_bytes_readed <audec->i2s_iec958_sync_gate) &&
+ !audec->need_stop
+ )
+ {
+ bytes_readed_diff=audec->pcm_bytes_readed*audec->codec_type-audec->raw_bytes_readed;
+ //adec_print("iec958 was slower than i2s:bytes_readed_diff/%d\n",-bytes_readed_diff);
+ while(bytes_readed_diff && !audec->need_stop){
+ readed_bytes=audec->adsp_ops.dsp_read_raw(&audec->adsp_ops,tmp,bytes_readed_diff>4096?4096: bytes_readed_diff);
+ audec->raw_bytes_readed+=readed_bytes;
+ bytes_readed_diff-=readed_bytes;
+ if(readed_bytes==0)
+ break;
+ }
+ }
+ //audec->i2s_iec958_sync_flag=0;
+ }
+ }
+
+ if (audec->adsp_ops.dsp_on) {
+ int bytes_cnt=0;
+ while(bytes_cnt<buffer->size && !audec->need_stop){
+ len=audec->adsp_ops.dsp_read_raw(&audec->adsp_ops, (char*)(buffer->i16)+bytes_cnt,buffer->size-bytes_cnt);
+ bytes_cnt+=len;
+ if (len == 0)
+ break;
+ }
+ buffer->size=bytes_cnt;
+ audec->raw_bytes_readed+=bytes_cnt;
+ } else {
+ adec_print("[%s %d]audioCallback: dsp not work!\n",__FUNCTION__,__LINE__);
+ }
+// memset raw data when start playback to walkround HDMI audio format changed noise for some kind of TV set
+ if(audec->format != ACODEC_FMT_TRUEHD ){
+ if(audec->raw_bytes_readed < 16*4*1024)
+ memset((char *)(buffer->i16),0,buffer->size);
+ }
+ return;
+}
+
+extern "C" int android_init_raw(struct aml_audio_dec* audec)
+{
+ Mutex::Autolock _l(mLock_raw);
+ adec_print("[%s %d]android raw_out init",__FUNCTION__,__LINE__);
+ status_t status;
+ AudioTrack *track;
+ audio_out_operations_t *out_ops = &audec->aout_ops;
+ int SampleRate=audec->samplerate;
+ out_ops->private_data_raw=NULL;
+ audio_format_t aformat = AUDIO_FORMAT_INVALID;
+ if((audec->format!=ACODEC_FMT_DTS) &&
+ (audec->format != ACODEC_FMT_AC3) &&
+ (audec->format != ACODEC_FMT_EAC3) &&
+ (audec->format != ACODEC_FMT_TRUEHD))
+ {
+ adec_print("[%s %d]NOTE: now just ACODEC_FMT_DTS_rawoutpu was support! ",__FUNCTION__,__LINE__);
+ return 0;
+ }else if(amsysfs_get_sysfs_int("/sys/class/audiodsp/digital_raw")==0){
+ adec_print("[%s %d]DIGITAL_RAW WAS DISABLE !",__FUNCTION__,__LINE__);
+ return 0;
+ }
+
+ if (audec->format == ACODEC_FMT_DTS)
+ aformat = AUDIO_FORMAT_DTS;
+ else if(audec->format == ACODEC_FMT_AC3)
+ aformat = AUDIO_FORMAT_AC3;
+ else if(audec->format == ACODEC_FMT_EAC3)
+ aformat = AUDIO_FORMAT_EAC3;
+ else if(audec->format == ACODEC_FMT_TRUEHD)
+ aformat = AUDIO_FORMAT_TRUEHD;
+
+ if(audec->format == ACODEC_FMT_TRUEHD){
+ audec->codec_type=16;
+ }
+
+ int dgraw = amsysfs_get_sysfs_int("/sys/class/audiodsp/digital_raw");
+ if (dgraw == 1 ) {
+ if((audec->format == ACODEC_FMT_AC3) ||
+ (audec->format == ACODEC_FMT_EAC3)){
+ /*if spdif pass through,force to DD otuput */
+ aformat = AUDIO_FORMAT_AC3;
+ audec->codec_type=1;
+ }else if(audec->format==ACODEC_FMT_DTS){
+ if(audec->samplerate==88200 || audec->samplerate==96000){
+ audec->codec_type=0.50;
+ SampleRate=audec->samplerate/2;
+ }else if(audec->samplerate==176400 || audec->samplerate==192000){
+ audec->codec_type=0.25;
+ SampleRate=audec->samplerate/4;
+ }else if(audec->samplerate==352800 || audec->samplerate==384000){
+ adec_print("[%s %d]NOTE:Current FS/%d was support! ",__FUNCTION__,__LINE__,audec->samplerate);
+ return 0;
+ }else{//audec->samplerate<=48000
+ audec->codec_type=1;
+ }
+ }
+ }else if(dgraw == 2 ){
+ if(audec->format == ACODEC_FMT_AC3){
+ audec->codec_type=1;
+ }else if(audec->format == ACODEC_FMT_EAC3){
+ audec->codec_type=4;
+ }else if(audec->format==ACODEC_FMT_DTS &&(audec->VersionNum!=DTSETC_DECODE_VERSION_M6_M8 ||audec->DTSHDIEC958_PktType==DTSHD_IEC958_PKTTYPE_CORE)){
+ if(audec->samplerate==88200 || audec->samplerate==96000){
+ audec->codec_type=0.50;
+ SampleRate=SampleRate/2;
+ }else if(audec->samplerate==176400 || audec->samplerate==192000){
+ audec->codec_type=0.25;
+ SampleRate=SampleRate/4;
+ }else if(audec->samplerate==352800 || audec->samplerate==384000){
+ adec_print("[%s %d]NOTE:Current FS/%d was support! ",__FUNCTION__,__LINE__,audec->samplerate);
+ return 0;
+ }else{//audec->samplerate<=48000
+ audec->codec_type=1;
+ }
+ }else if(audec->format==ACODEC_FMT_DTS && audec->VersionNum==DTSETC_DECODE_VERSION_M6_M8){
+ int unvalidpara=0;
+ if(audec->DTSHDIEC958_PktType==DTSHD_IEC958_PKTTYPE_SINGLEI2S){
+ if(audec->DTSHDIEC958_FS==48000||audec->DTSHDIEC958_FS==44100)
+ {
+ SampleRate=audec->DTSHDIEC958_FS;
+ }else if(audec->DTSHDIEC958_FS==192000||audec->DTSHDIEC958_FS==176400){// clock need Mutiple 4
+ SampleRate=audec->DTSHDIEC958_FS/4;
+ #if ANDROID_PLATFORM_SDK_VERSION >= 21//android 5.0
+ aformat = (audio_format_t)AUDIO_FORMAT_DTS_HD;
+ SampleRate=audec->DTSHDIEC958_FS;
+ #endif
+ }else{
+ unvalidpara=1;
+ }
+ }else if(audec->DTSHDIEC958_PktType==DTSHD_IEC958_PKTTYPE_FOURI2S){// clock need Mutiple 4
+ if(audec->DTSHDIEC958_FS==192000||audec->DTSHDIEC958_FS==384000 || audec->DTSHDIEC958_FS==768000 ||
+ audec->DTSHDIEC958_FS==176400||audec->DTSHDIEC958_FS==352800 || audec->DTSHDIEC958_FS==705600)
+ {
+ SampleRate=audec->DTSHDIEC958_FS/4;
+ #if ANDROID_PLATFORM_SDK_VERSION >= 21//android 5.0
+ aformat = (audio_format_t)AUDIO_FORMAT_DTS_MASTER;
+ SampleRate=audec->DTSHDIEC958_FS;
+ #endif
+ }else{
+ unvalidpara=2;
+ }
+ }else{
+ unvalidpara=3;
+ }
+ if(unvalidpara){
+ adec_print("[%s %d]NOTE:Unvalid Paras/%d for RawOutput:PCM_FS/%d IEC958_FS/%d PCMSamsInFrm/%d IEC958PktFrmSize/%d ",
+ __FUNCTION__,__LINE__,unvalidpara,audec->samplerate,audec->DTSHDIEC958_FS,audec->DTSHDPCM_SamsInFrmAtMaxSR,audec->DTSHDIEC958_PktFrmSize);
+ return 0;
+ }
+ audec->codec_type=audec->DTSHDIEC958_FS/audec->samplerate;
+ }
+ }
+
+ if(audec->format == ACODEC_FMT_TRUEHD){
+ SampleRate=192000;
+ }
+ adec_print("[%s %d]SampleRate used for init rawoutput:%d\n",__FUNCTION__,__LINE__,SampleRate);
+
+#if ANDROID_PLATFORM_SDK_VERSION < 19
+ track = new AudioTrack();
+ if (track == NULL) {
+ adec_print("[%s %d]AudioTrack_raw Create Failed!",__FUNCTION__,__LINE__);
+ return -1;
+ }
+#else
+ mpAudioTrack_raw = new AudioTrack();
+ track = mpAudioTrack_raw.get();
+#endif
+
+ audio_session_t SessionID = AUDIO_SESSION_NONE;//audec->SessionID;
+ adec_print("[%s %d]SessionID = %d audec->codec_type/%f audec->samplerate/%d",__FUNCTION__,__LINE__,SessionID,audec->codec_type,audec->samplerate);
+ int flags = AUDIO_OUTPUT_FLAG_DIRECT;
+//only defined from android M
+#if ANDROID_PLATFORM_SDK_VERSION >= 23
+ flags |= AUDIO_OUTPUT_FLAG_IEC958_NONAUDIO;
+#endif
+ status = track->set(AUDIO_STREAM_MUSIC,
+ SampleRate,
+ aformat,
+ AUDIO_CHANNEL_OUT_STEREO,
+ 0, // frameCount
+ (audio_output_flags_t)flags,
+ audioCallback_raw,
+ audec, // user when callback
+ 0, // notificationFrames
+ 0, // shared buffer
+ false, // threadCanCallJava
+ SessionID); // sessionId
+ if (status != NO_ERROR) {
+ adec_print("[%s %d]track->set returns %d",__FUNCTION__,__LINE__, status);
+ adec_print("[%s %d]audio out samplet %d",__FUNCTION__,__LINE__, audec->samplerate);
+ adec_print("[%s %d]audio out channels %d",__FUNCTION__,__LINE__, audec->channels);
+#if ANDROID_PLATFORM_SDK_VERSION < 19
+ delete track;
+ track = NULL;
+#else
+ track = NULL;
+ mpAudioTrack_raw.clear();
+#endif
+ out_ops->audio_out_raw_enable = 0;
+ out_ops->private_data_raw=NULL;
+ return -1;
+ }
+
+ out_ops->private_data_raw= (void *)track;
+
+ //1/10=0.1s=100ms
+ audec->raw_frame_size=audec->channels*(audec->adec_ops->bps>>3);
+ audec->max_bytes_readded_diff=audec->samplerate*audec->raw_frame_size*audec->codec_type/10;
+ audec->i2s_iec958_sync_gate=audec->samplerate*audec->raw_frame_size*audec->codec_type*0.4;//400ms
+ return 0;
+}
+#endif
+//-------------------------------------------------------------------------
+/**
+ * \brief output initialization
+ * \param audec pointer to audec
+ * \return 0 on success otherwise negative error code
+ */
+extern "C" int android_init(struct aml_audio_dec* audec)
+{
+ Mutex::Autolock _l(mLock);
+ status_t status;
+ AudioTrack *track;
+ audio_out_operations_t *out_ops = &audec->aout_ops;
+ char wfd_prop[PROPERTY_VALUE_MAX];
+ fill_audiotrack_zero = 0;
+ buffering_audio_data = 0;
+ skip_unnormal_discontinue = 0;
+ unnormal_discontinue = 0;
+ unnormal_discontinue1 = 0;
+ ttt = 0;
+ resample = 0;
+ last_resample = 0;
+ xxx = 0;
+ memset(&diff_record[0], 0, 0x40*sizeof(diff_record[0]));
+ diff_wp = 0;
+ if (get_audio_decoder() == AUDIO_ARC_DECODER) {
+ wfd_ds_thrdhold = 220;
+ wfd_us_thrdhold = 180;
+
+ }
+ else{
+ wfd_ds_thrdhold = 250;
+ wfd_us_thrdhold = 150;
+ }
+ adec_print("up/down sampling thread %d /%d ms \n",wfd_us_thrdhold,wfd_ds_thrdhold);
+ if(property_get("media.libplayer.wfd", wfd_prop, "0") > 0){
+ wfd_enable = (strcmp(wfd_prop, "1") == 0);
+ if(wfd_enable)
+ {
+ audio_io_handle_t handle = AudioSystem::getOutput(AUDIO_STREAM_MUSIC,
+ 48000,
+ AUDIO_FORMAT_PCM_16_BIT,
+ AUDIO_CHANNEL_OUT_STEREO,
+#if defined(_VERSION_ICS)
+ AUDIO_POLICY_OUTPUT_FLAG_INDIRECT
+#else //JB...
+ AUDIO_OUTPUT_FLAG_PRIMARY
+#endif
+ );
+ if(handle > 0){
+ char str[64];
+ status_t ret;
+ memset(str,0,sizeof(str));
+ // backup old framecount
+#if ANDROID_PLATFORM_SDK_VERSION >= 21 //FIXME on 5.0
+ AudioSystem::getFrameCount(handle,&old_frame_count);
+#else
+ AudioSystem::getFrameCount(handle, AUDIO_STREAM_MUSIC, &old_frame_count);
+#endif
+
+ sprintf(str,"frame_count=%d",256);
+ ret = AudioSystem::setParameters(handle, String8(str));
+ if(ret != 0){
+ adec_print("change frame count failed: ret = %d\n", ret);
+ }
+ adec_print("wfd: %s", str);
+ }
+ }
+ }else{
+ wfd_enable = 0;
+ }
+
+ adec_get_tsync_info(&(audec->tsync_mode));
+ adec_print("wfd_enable = %d, tsync_mode=%d, ", wfd_enable, audec->tsync_mode);
+ //--------------------------------------------
+ //alwas effect in case:
+ //1: rawoutput==1 && format==ACODEC_FMT_AC3 && (FS==32000 ||FS = =44100)
+ //2: rawoutput==1 && format==ACODEC_FMT_EC3 && (FS==32000 ||FS = =44100)
+ //3: rawoutput==1 && format==ACODEC_FMT_DTS && (FS==32000 ||FS = =44100||FS = =88200||FS = =96000|| FS = =176400|| FS = =192000)
+ //4: rawoutput==2 && format==ACODEC_FMT_EC3 && FS==44100
+ //5: rawoutput==2 && format==ACODEC_FMT_DTS && (FS= =32000||FS = =44100||FS = =88200||FS = =96000|| FS = =176400|| FS = =192000)
+ //6: rawoutput==0 && format==ACODEC_FMT_AC3 && CH==8
+ //summary:always effect in case: rawoutput>0 && (format=ACODEC_FMT_DTS or ACODEC_FMT_AC3) or 8chPCM _output
+/*after 6.0,need not this code*/
+#if ANDROID_PLATFORM_SDK_VERSION < 23
+ reset_system_samplerate(audec);
+#endif
+ int user_raw_enable = amsysfs_get_sysfs_int("/sys/class/audiodsp/digital_raw");
+#ifdef USE_ARM_AUDIO_DEC
+ out_ops->audio_out_raw_enable = user_raw_enable && (audec->format == ACODEC_FMT_DTS ||
+ audec->format == ACODEC_FMT_AC3 ||
+ audec->format == ACODEC_FMT_EAC3||
+ (audec->format == ACODEC_FMT_TRUEHD && user_raw_enable == 2));
+ if(out_ops->audio_out_raw_enable)
+ android_init_raw(audec);
+#endif
+ //---------------------------
+ adec_print("[%s %d]android out init",__FUNCTION__,__LINE__);
+#if ANDROID_PLATFORM_SDK_VERSION < 19
+ track = new AudioTrack();
+ if (track == NULL) {
+ adec_print("[%s %d]AudioTrack Create Failed!",__FUNCTION__,__LINE__);
+ return -1;
+ }
+#else
+ mpAudioTrack = new AudioTrack();
+ track = mpAudioTrack.get();
+#endif
+
+ audio_session_t SessionID = audec->SessionID;
+ adec_print("[%s %d]SessionID = %d audec->dtshdll_flag/%d audec->channels/%d",__FUNCTION__,__LINE__,SessionID,audec->dtshdll_flag,audec->channels);
+#if defined(_VERSION_JB)
+ char tmp[128]={0};
+ int FS_88_96_enable=0;
+ if (property_get("media.libplayer.88_96K", tmp, "0") > 0 && !strcmp(tmp, "1")) {
+ FS_88_96_enable=1;
+ if (audec->format == ACODEC_FMT_DTS && audec->samplerate>48000 && !user_raw_enable)
+ {
+ adec_print("set digital_codec to AUDIO_FORMAT_DTS_PCM_88K_96K");
+ }
+ }
+ if( audec->channels == 8 ||
+ (audec->format ==ACODEC_FMT_DTS && audec->samplerate>48000 && user_raw_enable==0 && FS_88_96_enable==1 )
+ )
+ { //8ch PCM: use direct output
+ //DTS PCMoutput && FS>48000: use direct output
+ audio_channel_mask_t ChMask;
+ audio_output_flags_t Flag;
+ audio_format_t aformat;
+ memset(tmp,0,sizeof(tmp));
+ if(audec->channels == 8){
+ adec_print("create multi-channel track use DirectOutput\n");
+ property_set(DOLBY_SYSTEM_CHANNEL,"true");
+ property_get(DOLBY_SYSTEM_CHANNEL, tmp, "0");
+ if(!strcmp(tmp, "true"))
+ {
+ adec_print("[%s %d]ds1.audio.multichannel.support set success!\n",__FUNCTION__,__LINE__);
+ }else{
+ adec_print("[%s %d]ds1.audio.multichannel.support set fail!\n",__FUNCTION__,__LINE__);
+ }
+ ChMask=AUDIO_CHANNEL_OUT_7POINT1;
+ Flag=AUDIO_OUTPUT_FLAG_DEEP_BUFFER;
+ aformat=AUDIO_FORMAT_PCM_16_BIT;
+ }else{
+ adec_print("create HD-PCM(Fs/%d>48000)Direct Ouputtrack\n",audec->samplerate);
+ ChMask=AUDIO_CHANNEL_OUT_STEREO;
+ Flag =AUDIO_OUTPUT_FLAG_DIRECT;
+//TODO
+#if ANDROID_PLATFORM_SDK_VERSION < 23
+ aformat = AUDIO_FORMAT_DTS;
+#else
+ aformat = AUDIO_FORMAT_PCM_16_BIT;
+#endif
+ }
+ status = track->set(AUDIO_STREAM_MUSIC,
+ audec->samplerate,
+ aformat,
+ ChMask,
+ 0, // frameCount
+ Flag/*AUDIO_OUTPUT_FLAG_NONE*/, // flags
+ audioCallback,
+ audec, // user when callback
+ 0, // notificationFrames
+ 0, // shared buffer
+ false, // threadCanCallJava
+ SessionID); // sessionId
+ }else{
+//here calculate the min framecount and set the audiotrack
+//refered to android_media_AudioTrack_get_min_buff_size
+//return frameCount * channelCount * bytesPerSample;
+ size_t frameCount = 0;
+ status = AudioTrack::getMinFrameCount(&frameCount, AUDIO_STREAM_DEFAULT,audec->samplerate);
+ if (status == NO_ERROR) {
+ frameCount = audec->channels*2*frameCount;
+ }
+ else
+ frameCount = 0;
+
+ status = track->set(AUDIO_STREAM_MUSIC,
+ audec->samplerate,
+ AUDIO_FORMAT_PCM_16_BIT,
+ (audec->channels == 1) ? AUDIO_CHANNEL_OUT_MONO : AUDIO_CHANNEL_OUT_STEREO,
+ frameCount, // frameCount
+ AUDIO_OUTPUT_FLAG_NONE, // flags
+ audioCallback,
+ audec, // user when callback
+ 0, // notificationFrames
+ 0, // shared buffer
+ false, // threadCanCallJava
+ SessionID); // sessionId
+ }
+
+#elif defined(_VERSION_ICS)
+ status = track->set(AUDIO_STREAM_MUSIC,
+ audec->samplerate,
+ AUDIO_FORMAT_PCM_16_BIT,
+ (audec->channels == 1) ? AUDIO_CHANNEL_OUT_MONO : AUDIO_CHANNEL_OUT_STEREO,
+ 0, // frameCount
+ 0, // flags
+ audioCallback,
+ audec, // user when callback
+ 0, // notificationFrames
+ 0, // shared buffer
+ false, // threadCanCallJava
+ SessionID); // sessionId
+#else // GB or lower:
+ status = track->set(AudioSystem::MUSIC,
+ audec->samplerate,
+ AudioSystem::PCM_16_BIT,
+ (audec->channels == 1) ? AudioSystem::CHANNEL_OUT_MONO : AudioSystem::CHANNEL_OUT_STEREO,
+ 0, // frameCount
+ 0, // flags
+ audioCallback,
+ audec, // user when callback
+ 0, // notificationFrames
+ 0, // shared buffer
+ SessionID);
+#endif
+
+ if (status != NO_ERROR) {
+ adec_print("[%s %d]track->set returns %d", __FUNCTION__,__LINE__,status);
+ adec_print("[%s %d]audio out samplet %d" , __FUNCTION__,__LINE__, audec->samplerate);
+ adec_print("[%s %d]audio out channels %d", __FUNCTION__,__LINE__,audec->channels);
+#if ANDROID_PLATFORM_SDK_VERSION < 19
+ delete track;
+ track = NULL;
+#else
+ track = NULL;
+ mpAudioTrack.clear();
+#endif
+ if(audec->channels == 8){
+ property_set(DOLBY_SYSTEM_CHANNEL,"false");
+ }
+ return -1;
+
+ }
+ af_resample_linear_init(audec);
+ out_ops->private_data = (void *)track;
+ return 0;
+}
+#ifdef USE_ARM_AUDIO_DEC
+extern "C" int android_start_raw(struct aml_audio_dec* audec)
+{
+ Mutex::Autolock _l(mLock_raw);
+ adec_print("[%s %d]android raw_out start",__FUNCTION__,__LINE__);
+ status_t status;
+ audio_out_operations_t *out_ops = &audec->aout_ops;
+
+#if ANDROID_PLATFORM_SDK_VERSION < 19
+ AudioTrack *track = (AudioTrack *)out_ops->private_data_raw;
+#else
+ AudioTrack *track = mpAudioTrack_raw.get();
+#endif
+ if (track == 0) {
+ adec_print("[%s %d]No track instance!\n",__FUNCTION__,__LINE__);
+ return -1;
+ }
+
+ status = track->initCheck();
+ if (status != NO_ERROR) {
+#if ANDROID_PLATFORM_SDK_VERSION < 19
+ delete track;
+#else
+ mpAudioTrack_raw.clear();
+#endif
+ out_ops->private_data_raw= NULL;
+ return -1;
+ }
+
+ track->start();
+ adec_print("[%s %d]AudioTrack_raw initCheck OK and started.",__FUNCTION__,__LINE__);
+ return 0;
+}
+#endif
+/**
+ * \brief start output
+ * \param audec pointer to audec
+ * \return 0 on success otherwise negative error code
+ *
+ * Call android_start(), then the callback will start being called.
+ */
+extern "C" int android_start(struct aml_audio_dec* audec)
+{
+
+ Mutex::Autolock _l(mLock);
+ status_t status;
+ audio_out_operations_t *out_ops = &audec->aout_ops;
+#if ANDROID_PLATFORM_SDK_VERSION < 19
+ AudioTrack *track = (AudioTrack *)out_ops->private_data;
+#else
+ AudioTrack *track = mpAudioTrack.get();
+#endif
+
+
+#ifdef USE_ARM_AUDIO_DEC
+ i2s_iec958_sync_force(audec,0);
+ if(out_ops->audio_out_raw_enable)
+ android_start_raw(audec);
+#endif
+ adec_print("android out start");
+ ttt = 0;
+ resample = 0;
+ last_resample = 0;
+ xxx = 0;
+ memset(&diff_record[0], 0, 0x40*sizeof(diff_record[0]));
+ diff_wp = 0;
+ if (track == 0) {
+ adec_print("No track instance!\n");
+ return -1;
+ }
+ status = track->initCheck();
+ if (status != NO_ERROR) {
+#if ANDROID_PLATFORM_SDK_VERSION < 19
+ delete track;
+#else
+ mpAudioTrack.clear();
+#endif
+ out_ops->private_data = NULL;
+ return -1;
+ }
+ track->start();
+ adec_print("AudioTrack initCheck OK and started.");
+
+ return 0;
+}
+
+extern "C" int android_pause_raw(struct aml_audio_dec* audec)
+{
+ Mutex::Autolock _l(mLock_raw);
+ adec_print("[%s %d]android raw_out pause",__FUNCTION__,__LINE__);
+ audio_out_operations_t *out_ops = &audec->aout_ops;
+
+#if ANDROID_PLATFORM_SDK_VERSION < 19
+ AudioTrack *track = (AudioTrack *)out_ops->private_data_raw;
+#else
+ AudioTrack *track = mpAudioTrack_raw.get();
+#endif
+ if (track == 0) {
+ adec_print("[%s %d]No track instance!\n",__FUNCTION__,__LINE__);
+ return -1;
+ }
+ track->pause();
+ return 0;
+}
+
+/**
+ * \brief pause output
+ * \param audec pointer to audec
+ * \return 0 on success otherwise negative error code
+ */
+extern "C" int android_pause(struct aml_audio_dec* audec)
+{
+
+ Mutex::Autolock _l(mLock);
+ audio_out_operations_t *out_ops = &audec->aout_ops;
+#if ANDROID_PLATFORM_SDK_VERSION < 19
+ AudioTrack *track = (AudioTrack *)out_ops->private_data;
+#else
+ AudioTrack *track = mpAudioTrack.get();
+#endif
+#ifdef USE_ARM_AUDIO_DEC
+ if(out_ops->audio_out_raw_enable)
+ android_pause_raw(audec);
+#endif
+ adec_print("android out pause");
+
+ if (track == 0) {
+ adec_print("No track instance!\n");
+ return -1;
+ }
+
+ track->pause();
+#ifdef USE_ARM_AUDIO_DEC
+ adec_print("[%s %d] PRE_PAUSE:raw_bytes_readed/%lld pcm_bytes_readed/%lld delta/%lld\n",__FUNCTION__,__LINE__,
+ audec->raw_bytes_readed,audec->pcm_bytes_readed,audec->pcm_bytes_readed-audec->raw_bytes_readed);
+ i2s_iec958_sync_force(audec,0);
+ adec_print("[%s %d] POST_PAUSE:raw_bytes_readed/%lld pcm_bytes_readed/%lld delta/%lld\n",__FUNCTION__,__LINE__,
+ audec->raw_bytes_readed,audec->pcm_bytes_readed,audec->pcm_bytes_readed-audec->raw_bytes_readed);
+ audec->i2s_iec958_sync_flag=1;
+#endif
+ return 0;
+}
+
+extern "C" int android_resume_raw(struct aml_audio_dec* audec)
+{
+ Mutex::Autolock _l(mLock_raw);
+ adec_print("[%s %d]android raw_out resume",__FUNCTION__,__LINE__);
+
+ audio_out_operations_t *out_ops = &audec->aout_ops;
+#if ANDROID_PLATFORM_SDK_VERSION < 19
+ AudioTrack *track = (AudioTrack *)out_ops->private_data_raw;
+#else
+ AudioTrack *track = mpAudioTrack_raw.get();
+#endif
+ if (track == 0) {
+ adec_print("[%s %d]No track instance!\n",__FUNCTION__,__LINE__);
+ return -1;
+ }
+ track->start();
+ return 0;
+}
+/**
+ * \brief resume output
+ * \param audec pointer to audec
+ * \return 0 on success otherwise negative error code
+ */
+extern "C" int android_resume(struct aml_audio_dec* audec)
+{
+
+ Mutex::Autolock _l(mLock);
+ audio_out_operations_t *out_ops = &audec->aout_ops;
+#if ANDROID_PLATFORM_SDK_VERSION < 19
+ AudioTrack *track = (AudioTrack *)out_ops->private_data;
+#else
+ AudioTrack *track = mpAudioTrack.get();
+#endif
+
+#ifdef USE_ARM_AUDIO_DEC
+ i2s_iec958_sync_force(audec,0);
+ if(out_ops->audio_out_raw_enable)
+ android_resume_raw(audec);
+#endif
+ adec_print("android out resume");
+ ttt = 0;
+ resample = 0;
+ last_resample = 0;
+ xxx = 0;
+ memset(&diff_record[0], 0, 0x40*sizeof(diff_record[0]));
+ diff_wp = 0;
+ if (track == 0) {
+ adec_print("No track instance!\n");
+ return -1;
+ }
+ track->start();
+
+ return 0;
+}
+#ifdef USE_ARM_AUDIO_DEC
+extern "C" int android_stop_raw(struct aml_audio_dec* audec)
+{
+ Mutex::Autolock _l(mLock_raw);
+ adec_print("[%s %d]android raw_out stop",__FUNCTION__,__LINE__);
+
+ audio_out_operations_t *out_ops = &audec->aout_ops;
+#if ANDROID_PLATFORM_SDK_VERSION < 19
+ AudioTrack *track = (AudioTrack *)out_ops->private_data_raw;
+#else
+ AudioTrack *track = mpAudioTrack_raw.get();
+#endif
+
+ if (track == 0){
+ adec_print("[%s %d]No track instance!\n",__FUNCTION__,__LINE__);
+ return -1;
+ }
+ track->stop();
+ /* release AudioTrack */
+#if ANDROID_PLATFORM_SDK_VERSION < 19
+ delete track;
+#else
+ mpAudioTrack_raw.clear();
+#endif
+
+ out_ops->private_data_raw= NULL;
+ return 0;
+}
+#endif
+/**
+ * \brief stop output
+ * \param audec pointer to audec
+ * \return 0 on success otherwise negative error code
+ */
+extern "C" int android_stop(struct aml_audio_dec* audec)
+{
+ Mutex::Autolock _l(mLock);
+ audio_out_operations_t *out_ops = &audec->aout_ops;
+#if ANDROID_PLATFORM_SDK_VERSION < 19
+ AudioTrack *track = (AudioTrack *)out_ops->private_data;
+#else
+ AudioTrack *track = mpAudioTrack.get();
+#endif
+#ifdef USE_ARM_AUDIO_DEC
+ if(out_ops->audio_out_raw_enable)
+ android_stop_raw(audec);
+#endif
+ adec_print("android out stop");
+ if(audec->channels == 8){
+ property_set(DOLBY_SYSTEM_CHANNEL,"false");
+ }
+ if (track == 0){
+ adec_print("No track instance!\n");
+ return -1;
+ }
+
+ track->stop();
+ /* release AudioTrack */
+#if ANDROID_PLATFORM_SDK_VERSION < 19
+ delete track;
+#else
+ mpAudioTrack.clear();
+#endif
+ out_ops->private_data = NULL;
+/*after 6.0,not need this code*/
+#if ANDROID_PLATFORM_SDK_VERSION < 23
+ restore_system_samplerate(audec);
+#endif
+ if(wfd_enable){
+ restore_system_framesize();
+ }
+ return 0;
+}
+
+/**
+ * \brief get output latency in ms
+ * \param audec pointer to audec
+ * \return output latency
+ */
+extern "C" unsigned long android_latency(struct aml_audio_dec* audec)
+{
+ unsigned long latency;
+ audio_out_operations_t *out_ops = &audec->aout_ops;
+
+#if ANDROID_PLATFORM_SDK_VERSION < 19
+ AudioTrack *track = (AudioTrack *)out_ops->private_data;
+#else
+ AudioTrack *track = mpAudioTrack.get();
+#endif
+ if (audec->use_get_out_posion && audec->aout_ops.get_out_position)
+ return 0;
+ if (track) {
+ status_t s;
+ int ret = -1;
+ int64_t write_samples;
+ int cache_samples;
+ int delay_us, t_us;
+ AudioTimestamp timestamp;
+ s = track->getTimestamp(timestamp);
+ if (s != NO_ERROR || timestamp.mPosition < 1) {
+ /*
+ timestamp.mPosition <= 0 we think audio not have start.
+ the latency is not accurate
+ */
+ return 0;
+ } else {
+ struct timespec timenow;
+ write_samples = audec->pcm_bytes_readed/(audec->channels * 2);
+ cache_samples = write_samples - timestamp.mPosition;
+ if (cache_samples < 0)
+ cache_samples = 0;
+ delay_us = 1000 * (cache_samples * 1000 / audec->samplerate);
+ clock_gettime(CLOCK_MONOTONIC, &timenow);
+ t_us = (timenow.tv_sec - timestamp.mTime.tv_sec) * 1000000LL +
+ (timenow.tv_nsec- timestamp.mTime.tv_nsec)/1000;
+ delay_us -=t_us;
+ if (delay_us < 0)
+ delay_us =0;
+ return delay_us/1000;
+ }
+ }
+ if (track) {
+ latency = track->latency();
+ return latency;
+ }
+ return 0;
+}
+
+/**
+ * \brief get output latency in ms
+ * \param audec pointer to audec
+ * \return output latency
+ */
+extern "C" int android_get_position(struct aml_audio_dec* audec,
+ int64_t *position,
+ int64_t *timeus)
+{
+ audio_out_operations_t *out_ops = &audec->aout_ops;
+ AudioTimestamp timestamp;
+ status_t s;
+ int ret = -1 ;
+#if ANDROID_PLATFORM_SDK_VERSION < 19
+ AudioTrack *track = (AudioTrack *)out_ops->private_data;
+#else
+ AudioTrack *track = mpAudioTrack.get();
+#endif
+
+ if (track) {
+ s = track->getTimestamp(timestamp);
+ if (s == NO_ERROR) {
+ *position = timestamp.mPosition;
+ *timeus = timestamp.mTime.tv_sec * 1000000LL + timestamp.mTime.tv_nsec / 1000;
+ return 0;
+ }
+ }
+ return ret;
+}
+
+
+#ifndef ANDROID_VERSION_JBMR2_UP
+/**
+ * \brief mute output
+ * \param audec pointer to audec
+ * \param en 1 = mute, 0 = unmute
+ * \return 0 on success otherwise negative error code
+ */
+extern "C" int android_mute_raw(struct aml_audio_dec* audec, adec_bool_t en)
+{
+ Mutex::Autolock _l(mLock_raw);
+ adec_print("[%s %d]android raw_out mute",__FUNCTION__,__LINE__);
+
+ audio_out_operations_t *out_ops = &audec->aout_ops;
+#if ANDROID_PLATFORM_SDK_VERSION < 19
+ AudioTrack *track = (AudioTrack *)out_ops->private_data_raw;
+#else
+ AudioTrack *track = mpAudioTrack_raw.get();
+#endif
+ if (track == 0) {
+ adec_print("No track instance!\n");
+ return -1;
+ }
+
+ track->mute(en);
+ return 0;
+}
+#endif
+extern "C" int android_mute(struct aml_audio_dec* audec, adec_bool_t en)
+{
+ Mutex::Autolock _l(mLock);
+ adec_print("android out mute");
+
+ audio_out_operations_t *out_ops = &audec->aout_ops;
+#if ANDROID_PLATFORM_SDK_VERSION < 19
+ AudioTrack *track = (AudioTrack *)out_ops->private_data;
+#else
+ AudioTrack *track = mpAudioTrack.get();
+#endif
+ if (!track) {
+ adec_print("No track instance!\n");
+ return -1;
+ }
+
+#ifdef ANDROID_VERSION_JBMR2_UP
+#else
+ #ifdef USE_ARM_AUDIO_DEC
+ if(out_ops->audio_out_raw_enable)
+ android_mute_raw(audec,en);
+ #endif
+ track->mute(en);
+#endif
+
+ return 0;
+}
+
+/**
+ * \brief set output volume
+ * \param audec pointer to audec
+ * \param vol volume value
+ * \return 0 on success otherwise negative error code
+ */
+extern "C" int android_set_volume(struct aml_audio_dec* audec, float vol)
+{
+ Mutex::Autolock _l(mLock);
+ adec_print("android set volume");
+
+ audio_out_operations_t *out_ops = &audec->aout_ops;
+#if ANDROID_PLATFORM_SDK_VERSION < 19
+ AudioTrack *track = (AudioTrack *)out_ops->private_data;
+#else
+ AudioTrack *track = mpAudioTrack.get();
+#endif
+ if (!track) {
+ adec_print("No track instance!\n");
+ return -1;
+ }
+
+ track->setVolume(vol, vol);
+
+ return 0;
+}
+
+/**
+ * \brief set left/right output volume
+ * \param audec pointer to audec
+ * \param lvol refer to left volume value
+ * \param rvol refer to right volume value
+ * \return 0 on success otherwise negative error code
+ */
+extern "C" int android_set_lrvolume(struct aml_audio_dec* audec, float lvol,float rvol)
+{
+ Mutex::Autolock _l(mLock);
+ adec_print("android set left and right volume separately");
+
+ audio_out_operations_t *out_ops = &audec->aout_ops;
+#if ANDROID_PLATFORM_SDK_VERSION < 19
+ AudioTrack *track = (AudioTrack *)out_ops->private_data;
+#else
+ AudioTrack *track = mpAudioTrack.get();
+#endif
+ if (!track) {
+ adec_print("No track instance!\n");
+ return -1;
+ }
+
+ track->setVolume(lvol, rvol);
+
+ return 0;
+}
+extern "C" int android_set_track_rate(struct aml_audio_dec* audec,void *rate)
+{
+#if ANDROID_PLATFORM_SDK_VERSION >= 23
+ Mutex::Autolock _l(mLock);
+ adec_print("android_set_track_rate");
+ struct AudioPlaybackRate Rate = *(struct AudioPlaybackRate*)rate;
+ audio_out_operations_t *out_ops = &audec->aout_ops;
+#if ANDROID_PLATFORM_SDK_VERSION < 19
+ AudioTrack *track = (AudioTrack *)out_ops->private_data;
+#else
+ AudioTrack *track = mpAudioTrack.get();
+#endif
+ if (!track) {
+ adec_print("No track instance!\n");
+ return -1;
+ }
+
+ track->setPlaybackRate(Rate);
+ out_ops->track_rate = Rate.mSpeed;
+#endif
+ return 0;
+}
+
+extern "C" void android_basic_init()
+{
+ Mutex::Autolock _l(mLock);
+ adec_print("android basic init!");
+ sp<ProcessState> proc(ProcessState::self());
+}
+
+/**
+ * \brief get output handle
+ * \param audec pointer to audec
+ */
+extern "C" void get_output_func(struct aml_audio_dec* audec)
+{
+ audio_out_operations_t *out_ops = &audec->aout_ops;
+
+ out_ops->init = android_init;
+ out_ops->start = android_start;
+ out_ops->pause = android_pause;
+ out_ops->resume = android_resume;
+ out_ops->stop = android_stop;
+ out_ops->latency = android_latency;
+ out_ops->mute = android_mute;
+ out_ops->set_volume = android_set_volume;
+ out_ops->set_lrvolume = android_set_lrvolume;
+ out_ops->set_track_rate = android_set_track_rate;
+ out_ops->get_out_position = android_get_position;
+ out_ops->audio_out_raw_enable = 1;
+ /* default set a invalid value*/
+ out_ops->track_rate = 8.8f;
+}
+
+}
+