summaryrefslogtreecommitdiff
authorZhe Wang <zhe.wang@amlogic.com>2017-02-25 05:54:43 (GMT)
committer Zhe Wang <zhe.wang@amlogic.com>2017-02-27 07:26:38 (GMT)
commit8eadf48f85d88a6e6dfbd061a06133eafd7050ff (patch)
treec3e3fde2c77a03a5062ea503f0cab8d06a2aae75
parent34d62d4d4e1de910e4d56b0dc2f8f0ff8fdb5910 (diff)
downloadaudio-8eadf48f85d88a6e6dfbd061a06133eafd7050ff.zip
audio-8eadf48f85d88a6e6dfbd061a06133eafd7050ff.tar.gz
audio-8eadf48f85d88a6e6dfbd061a06133eafd7050ff.tar.bz2
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 <zhe.wang@amlogic.com>
Diffstat
-rw-r--r--audio_hw.c2
-rw-r--r--libTVaudio/audio/DDP_media_source.cpp14
-rw-r--r--libTVaudio/audio/DTSHD_media_source.cpp15
-rw-r--r--libTVaudio/audio/aml_audio.c41
-rw-r--r--libTVaudio/audio/android_out.cpp28
5 files changed, 67 insertions, 33 deletions
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) {