From 8eadf48f85d88a6e6dfbd061a06133eafd7050ff Mon Sep 17 00:00:00 2001 From: Zhe Wang Date: Sat, 25 Feb 2017 05:54:43 +0000 Subject: PD#139593: fixed crash of ddp and dts raw data from hdmi-in 1) set channel Num and sr to mediasource 2) Don't do acodec start when mediacodec init error 3) merge some commit from m-amlogic Change-Id: I26fbae1e6bdb4517cfbe2727bb8c867c7959c26a Signed-off-by: Zhe Wang --- diff --git a/audio_hw.c b/audio_hw.c index c666627..ff36310 100644 --- a/audio_hw.c +++ b/audio_hw.c @@ -3323,7 +3323,7 @@ static int adev_open_output_stream(struct audio_hw_device *dev, *stream_out = &out->stream; - if (out->is_tv_platform) { + if (out->is_tv_platform && !(flags & AUDIO_OUTPUT_FLAG_DIRECT)) { out->config.channels = 8; out->config.format = PCM_FORMAT_S32_LE; out->tmp_buffer_8ch = malloc(out->config.period_size * 4 * 8); diff --git a/libTVaudio/audio/DDP_media_source.cpp b/libTVaudio/audio/DDP_media_source.cpp index 7de39b2..55769cd 100644 --- a/libTVaudio/audio/DDP_media_source.cpp +++ b/libTVaudio/audio/DDP_media_source.cpp @@ -330,6 +330,8 @@ DDP_Media_Source::DDP_Media_Source(void) { mChNum = 0; mFrame_size = 0; mStop_ReadBuf_Flag = 0; //0:start 1:stop + mMeta->setInt32(kKeyChannelCount, 2); + mMeta->setInt32(kKeySampleRate, 48000); } DDP_Media_Source::~DDP_Media_Source() { @@ -545,6 +547,10 @@ status_t Aml_OMX_Codec::read(unsigned char *buf, unsigned *size, int *exit) { MediaBuffer *srcBuffer; status_t status; + if (m_codec == NULL) { + return -1; + } + m_OMXMediaSource->Set_Stop_ReadBuf_Flag(*exit); if (*exit) { @@ -581,7 +587,13 @@ status_t Aml_OMX_Codec::read(unsigned char *buf, unsigned *size, int *exit) { status_t Aml_OMX_Codec::start() { ALOGI("[Aml_OMX_Codec::%s %d] enter!\n", __FUNCTION__, __LINE__); - status_t status = m_codec->start(); + status_t status; + if (m_codec != NULL) + status = m_codec->start(); + else + ALOGE("m_codec==NULL, m_codec->pause() start! [%s %d] \n", + __FUNCTION__, __LINE__); + if (status != OK) { ALOGE("Err:OMX client can't start OMX decoder! status=%d (0x%08x)\n", (int) status, (int) status); diff --git a/libTVaudio/audio/DTSHD_media_source.cpp b/libTVaudio/audio/DTSHD_media_source.cpp index 6945da3..f3c107c 100644 --- a/libTVaudio/audio/DTSHD_media_source.cpp +++ b/libTVaudio/audio/DTSHD_media_source.cpp @@ -124,6 +124,9 @@ Dtshd_Media_Source::Dtshd_Media_Source(void) { mCurrentTimeUs=0; bytes_readed_sum_pre=0; bytes_readed_sum=0; + + mMeta->setInt32(kKeyChannelCount, 2); + mMeta->setInt32(kKeySampleRate, 48000); } Dtshd_Media_Source::~Dtshd_Media_Source() { @@ -341,6 +344,10 @@ status_t Aml_OMX_DtsCodec::read(unsigned char *buf, unsigned *size, int *exit) { status_t status; m_OMXMediaSource->Set_Stop_ReadBuf_Flag(*exit); + if (m_codec == NULL) { + return -1; + } + if (*exit) { ALOGI("NOTE:exit flag enabled! [%s %d] \n", __FUNCTION__, __LINE__); *size = 0; @@ -375,7 +382,13 @@ status_t Aml_OMX_DtsCodec::read(unsigned char *buf, unsigned *size, int *exit) { status_t Aml_OMX_DtsCodec::start() { ALOGI("[Aml_OMX_DtsCodec::%s %d] enter!\n", __FUNCTION__, __LINE__); - status_t status = m_codec->start(); + status_t status; + if (m_codec != NULL) + status = m_codec->start(); + else + ALOGE("m_codec==NULL, m_codec->pause() start! [%s %d] \n", + __FUNCTION__, __LINE__); + if (status != OK) { ALOGE("Err:OMX client can't start OMX decoder! status=%d (0x%08x)\n", (int) status, (int) status); diff --git a/libTVaudio/audio/aml_audio.c b/libTVaudio/audio/aml_audio.c index 9ce0dd3..f99b99f 100644 --- a/libTVaudio/audio/aml_audio.c +++ b/libTVaudio/audio/aml_audio.c @@ -282,7 +282,6 @@ static int digital_raw_enable = 0; int output_record_enable = 0; int spdif_audio_type = LPCM; int type_AUDIO_IN = -1; -pthread_mutex_t device_change_lock = PTHREAD_MUTEX_INITIALIZER; static void DoDumpData(void *data_buf, int size, int aud_src_type); static int audio_effect_process(short* buffer, int frame_size); @@ -1044,7 +1043,9 @@ static int amaudio_out_close(struct aml_stream_out *out) { pthread_mutex_lock(&out->lock); if (out->is_tv_platform == 1) { free(out->tmp_buffer_8ch); + out->tmp_buffer_8ch = NULL; free(out->audioeffect_tmp_buffer); + out->audioeffect_tmp_buffer = NULL; } if (out->amAudio_OutHandle > 0) { close(out->amAudio_OutHandle); @@ -1061,6 +1062,10 @@ static int amaudio_out_write(struct aml_stream_out *out, void* buffer, int input_frames = bytes >> 2; unsigned char *out_buffer = NULL; + if (!out->tmp_buffer_8ch || !out->audioeffect_tmp_buffer) { + ALOGE("buffer NULL,!!!!check\n"); + return -1; + } pthread_mutex_lock(&out->lock); if (out->is_tv_platform == 1) { @@ -1307,12 +1312,7 @@ static int aml_device_init(struct aml_dev *device) { ALOGE("%s, Load aml_IIR lib fail!\n", __FUNCTION__); device->has_aml_IIR_lib = 0; } else { - char value[PROPERTY_VALUE_MAX]; - int paramter = 0; - if (property_get("media.audio.LFP.paramter", value, NULL) > 0) { - paramter = atoi(value); - } - aml_IIR_init(paramter); + aml_IIR_init(0); device->has_aml_IIR_lib = 1; } @@ -1382,24 +1382,25 @@ static void USB_check(struct aml_stream_out *out) { } if ((gUSBCheckFlag & AUDIO_DEVICE_OUT_SPEAKER) == 0) { - if (out->output_device == CC_OUT_USE_AMAUDIO && omx_started == 0) { + if (out->output_device == CC_OUT_USE_AMAUDIO) { amaudio_out_close(out); set_output_deviceID(MODEANDROID); out->output_device = CC_OUT_USE_ANDROID; - } else if (out->output_device == CC_OUT_USE_ALSA && omx_started == 0) { + tmp_buffer_reset(&android_out_buffer); + } else if (out->output_device == CC_OUT_USE_ALSA) { alsa_out_close(out); new_audiotrack(out); set_output_deviceID(MODEANDROID); out->output_device = CC_OUT_USE_ANDROID; + tmp_buffer_reset(&android_out_buffer); } ALOGI("%s, USB audio playback device is in.\n", __FUNCTION__); } else if ((gUSBCheckFlag & AUDIO_DEVICE_OUT_SPEAKER) != 0 && gUSBCheckLastFlag != 0) { - if (out->user_set_device == CC_OUT_USE_AMAUDIO && omx_started == 0) { + if (out->user_set_device == CC_OUT_USE_AMAUDIO) { amaudio_out_open(out); set_output_deviceID(MODEAMAUDIO); out->output_device = CC_OUT_USE_AMAUDIO; - } else if (out->user_set_device == CC_OUT_USE_ALSA - && omx_started == 0) { + } else if (out->user_set_device == CC_OUT_USE_ALSA) { release_audiotrack(out); alsa_out_open(out); set_output_deviceID(MODEAMAUDIO); @@ -1486,10 +1487,11 @@ err_exit: alsa_out_close(out); new_audiotrack(out); } + digital_raw_enable = amsysfs_get_sysfs_int("/sys/class/audiodsp/digital_raw"); + tmp_buffer_reset(&android_out_buffer); set_output_deviceID(MODERAW); out->output_device = CC_OUT_USE_ANDROID; set_Hardware_resample(4); - digital_raw_enable = amsysfs_get_sysfs_int("/sys/class/audiodsp/digital_raw"); if (audioin_type == AC3 || audioin_type == EAC3) omx_codec_init(); if (audioin_type == DTS || audioin_type == DTSHD) @@ -1501,6 +1503,8 @@ static int set_rawdata_in_disable(struct aml_stream_out *out) { omx_codec_close(); omx_codec_dts_close(); + release_raw_audio_track(); + if ((gUSBCheckFlag & AUDIO_DEVICE_OUT_SPEAKER) != 0) { if (out->user_set_device == CC_OUT_USE_AMAUDIO) { set_output_deviceID(MODEAMAUDIO); @@ -1516,6 +1520,7 @@ static int set_rawdata_in_disable(struct aml_stream_out *out) { out->output_device = CC_OUT_USE_ALSA; } } else { + tmp_buffer_reset(&android_out_buffer); set_output_deviceID(MODEANDROID); out->output_device = CC_OUT_USE_ANDROID; } @@ -1524,7 +1529,6 @@ static int set_rawdata_in_disable(struct aml_stream_out *out) { } int set_output_record_enable(int enable) { - pthread_mutex_lock(&device_change_lock); if (enable == 0) { output_record_enable = 0; ALOGI("%s, set output record disable!\n", __FUNCTION__); @@ -1534,7 +1538,6 @@ int set_output_record_enable(int enable) { } else { ALOGE("%s, invalid setting!\n", __FUNCTION__); } - pthread_mutex_unlock(&device_change_lock); return 0; } @@ -1667,6 +1670,7 @@ static void* aml_audio_threadloop(void *data __unused) { prctl(PR_SET_NAME, (unsigned long)"aml_TV_audio"); ret = aml_device_init(gpAmlDevice); if (ret < 0) { + gpAmlDevice->aml_Audio_ThreadExecFlag = 0; ALOGE("%s, Devices fail opened!\n", __FUNCTION__); return NULL; } @@ -1728,11 +1732,12 @@ static void* aml_audio_threadloop(void *data __unused) { } else if (gpAmlDevice->out.output_device == CC_OUT_USE_ANDROID) { output_size = buffer_write(&android_out_buffer, out->temp_buffer, output_size); + if (output_size < 0) { + usleep(200*1000); + } } - if (output_size < 0) { - //ALOGE("%s, out_write fail! bytes = %d \n", __FUNCTION__, output_size); - } else { + if (output_size > 0) { out->read_buffer = update_pointer((char *) out->read_buffer, output_size, (char *) start_temp_buffer, TEMP_BUFFER_SIZE); diff --git a/libTVaudio/audio/android_out.cpp b/libTVaudio/audio/android_out.cpp index 5ee84a6..406f859 100644 --- a/libTVaudio/audio/android_out.cpp +++ b/libTVaudio/audio/android_out.cpp @@ -30,7 +30,6 @@ extern struct circle_buffer DDP_out_buffer; extern struct circle_buffer DD_out_buffer; extern int output_record_enable; extern int spdif_audio_type; -extern pthread_mutex_t device_change_lock; int I2S_state = 0; static int raw_start_flag = 0; @@ -104,7 +103,7 @@ static void AudioTrackCallback(int event, void* user, void *info) { return; } int bytes = 0; - pthread_mutex_lock(&device_change_lock); + // code for raw data start audio_format_t aformat = AUDIO_FORMAT_INVALID; int user_raw_enable = amsysfs_get_sysfs_int("/sys/class/audiodsp/digital_raw"); @@ -158,7 +157,7 @@ static void AudioTrackCallback(int event, void* user, void *info) { memset(buffer->i16, 0, buffer->size); } } - pthread_mutex_unlock(&device_change_lock); + I2S_state += 1; return; } @@ -172,9 +171,10 @@ static int RawAudioTrackRelease(void) { } if (gmpAudioTracker_raw != NULL ) { gmpAudioTracker_raw.clear(); + gmpAudioTracker_raw = NULL; ALOGI("RawAudioTrackRelease done\n"); } - gmpAudioTracker_raw = NULL; + // raw end #if 0 if (last_raw_flag == 2) { @@ -194,8 +194,9 @@ static int AudioTrackRelease(void) { if (gmpAudioTracker != NULL ) { gmpAudioTracker.clear(); + gmpAudioTracker = NULL; } - RawAudioTrackRelease(); + return 0; } static int RawAudioTrackInit(audio_format_t aformat,int sr) @@ -204,23 +205,26 @@ static int RawAudioTrackInit(audio_format_t aformat,int sr) int user_raw_enable = amsysfs_get_sysfs_int("/sys/class/audiodsp/digital_raw"); int ddp_passth = (user_raw_enable == 2)&&(spdif_audio_type == EAC3); int ret; + ALOGD("%s, entering...,aformat %x,sr %d\n", __FUNCTION__,aformat,sr); //raw here if (gmpAudioTracker_raw != NULL) { - gmpAudioTracker_raw = gmpAudioTracker_raw.get(); + glpTracker_raw = gmpAudioTracker_raw.get(); } else { gmpAudioTracker_raw = new AudioTrack(); if (gmpAudioTracker_raw == NULL) { ALOGE("%s, new gmpAudioTracker_raw failed.\n", __FUNCTION__); return -1; } - gmpAudioTracker_raw = gmpAudioTracker_raw.get(); + glpTracker_raw = gmpAudioTracker_raw.get(); } + Status = glpTracker_raw->set(AUDIO_STREAM_MUSIC, sr, aformat, - AUDIO_CHANNEL_OUT_STEREO, 0, (audio_output_flags_t)(AUDIO_OUTPUT_FLAG_DIRECT - | AUDIO_OUTPUT_FLAG_IEC958_NONAUDIO) - , - RawAudioTrackCallback/*NULL*/, NULL, 0, 0, false, (audio_session_t)0); + AUDIO_CHANNEL_OUT_STEREO, 0, + (audio_output_flags_t)(AUDIO_OUTPUT_FLAG_DIRECT + | AUDIO_OUTPUT_FLAG_IEC958_NONAUDIO), + RawAudioTrackCallback, NULL, + 0, 0, false, (audio_session_t)0); if (Status != NO_ERROR) { ALOGE("%s, AudioTrack raw set failed.\n", __FUNCTION__); if (gmpAudioTracker_raw != NULL ) { @@ -258,7 +262,7 @@ static int AudioTrackInit(void) { I2S_state = 0; if (gmpAudioTracker != NULL) { - glpTracker = gmpAudioTracker.get(); + glpTracker = gmpAudioTracker.get(); } else { gmpAudioTracker = new AudioTrack(); if (gmpAudioTracker == NULL) { -- cgit