summaryrefslogtreecommitdiff
path: root/amadec/omx_audio/ALAC_mediasource.cpp (plain)
blob: c8e6f42fb2c55280bd044e92129bc28be4c39698
1#include <stdio.h>
2#include <stdarg.h>
3#include <string.h>
4#include <android/log.h>
5#include <cutils/properties.h>
6#include "ALAC_mediasource.h"
7
8extern "C" int read_buffer(unsigned char *buffer,int size);
9
10#define LOG_TAG "ALAC_Medissource"
11#define ALOGI(...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)
12#define ALOGE(...) __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__)
13
14#define MaxFrameSize 16384
15
16namespace android {
17
18int ALAC_MediaSource::set_ALAC_MetaData(aml_audio_dec_t *audec)
19{
20 mMeta->setInt32(kKeyChannelCount, audec->channels);
21 ChNum = audec->channels;
22 mMeta->setInt32(kKeySampleRate, audec->samplerate);
23 sample_rate = audec->samplerate;
24 mMeta->setInt32(kKeyExtraDataSize, audec->extradata_size);
25 extradata_size = audec->extradata_size;
26 mMeta->setData(kKeyExtraData,0,audec->extradata,audec->extradata_size);
27
28 ALOGI("channel_number = [%d], samplerate = [%d], extradata_size = [%d]\n",ChNum,sample_rate,extradata_size);
29
30 return 0;
31}
32int ALAC_MediaSource::MediaSourceRead_buffer(unsigned char *buffer,int size)
33{
34 int readcnt=0;
35 int readsum=0;
36 if(fpread_buffer!=NULL)
37 { int sleep_time=0;
38 while((readsum<size) && (*pStop_ReadBuf_Flag==0))
39 {
40 readcnt=fpread_buffer(buffer+readsum,size-readsum);
41 if(readcnt<(size-readsum)){
42 sleep_time++;
43 usleep(10000);
44 }
45 readsum+=readcnt;
46 if(sleep_time > 200){ //wait for max 2s to get audio data
47 ALOGE("[%s] Can't get data from audiobuffer,wait for %d ms\n ", __FUNCTION__,sleep_time*10);
48 }
49 }
50 if(*pStop_ReadBuf_Flag==1)
51 {
52 ALOGI("[%s] End of Stream: *pStop_ReadBuf_Flag==1\n ", __FUNCTION__);
53 }
54 return readsum;
55 }else{
56 ALOGE("[%s]ERR: fpread_buffer=NULL\n ", __FUNCTION__);
57 return 0;
58 }
59}
60
61//-------------------------------------------------------------------------
62ALAC_MediaSource::ALAC_MediaSource(void *read_buffer, aml_audio_dec_t *audec)
63{
64 ALOGI("[%s] in line (%d) \n",__FUNCTION__,__LINE__);
65 mStarted=false;
66 mMeta=new MetaData;
67 mDataSource=NULL;
68 mGroup=NULL;
69 mCurrentTimeUs=0;
70 pStop_ReadBuf_Flag=NULL;
71 fpread_buffer=(fp_read_buffer)read_buffer;
72 sample_rate=0;
73 ChNum=0;
74 frame_size=0;
75 bytes_readed_sum=0;
76 bytes_readed_sum_pre=0;
77 set_ALAC_MetaData(audec);
78
79}
80ALAC_MediaSource::~ALAC_MediaSource()
81{
82 ALOGI("[%s] in line (%d) \n",__FUNCTION__,__LINE__);
83 if (mStarted)
84 stop();
85}
86int ALAC_MediaSource::GetSampleRate()
87{
88 return sample_rate;
89}
90
91int ALAC_MediaSource::GetChNum()
92{
93 return ChNum;
94}
95
96int* ALAC_MediaSource::Get_pStop_ReadBuf_Flag()
97{
98 return pStop_ReadBuf_Flag;
99}
100
101int ALAC_MediaSource::Set_pStop_ReadBuf_Flag(int *pStop)
102{
103 pStop_ReadBuf_Flag = pStop;
104 return 0;
105}
106
107int ALAC_MediaSource::GetReadedBytes()
108{ int bytes_used = 0;
109 bytes_used=bytes_readed_sum-bytes_readed_sum_pre;
110 if(bytes_used<0)
111 {
112 ALOGI("[%s]WARING: bytes_readed_sum(%lld) < bytes_readed_sum_pre(%lld) \n",__FUNCTION__,
113 bytes_readed_sum,bytes_readed_sum_pre);
114 bytes_used=0;
115 }
116 bytes_readed_sum_pre=bytes_readed_sum;
117 return bytes_used;
118}
119
120sp<MetaData> ALAC_MediaSource::getFormat() {
121 ALOGI("[%s] in line (%d) \n",__FUNCTION__,__LINE__);
122 return mMeta;
123}
124
125status_t ALAC_MediaSource::start(MetaData *params)
126{
127 ALOGI("[%s] in line (%d) \n",__FUNCTION__,__LINE__);
128 mGroup = new MediaBufferGroup;
129 mGroup->add_buffer(new MediaBuffer(MaxFrameSize));
130 mStarted = true;
131 return OK;
132}
133
134status_t ALAC_MediaSource::stop()
135{
136 ALOGI("[%s] in line (%d) \n",__FUNCTION__,__LINE__);
137 delete mGroup;
138 mGroup = NULL;
139 mStarted = false;
140 return OK;
141}
142
143status_t ALAC_MediaSource::read(MediaBuffer **out, const ReadOptions *options)
144{
145 *out = NULL;
146 unsigned char header_buffer[5];
147 frame_size = 0;
148
149 if (*pStop_ReadBuf_Flag==1){
150 ALOGI("Stop_ReadBuf_Flag==1 stop read_buf [%s %d]",__FUNCTION__,__LINE__);
151 return ERROR_END_OF_STREAM;
152 }
153
154 MediaSourceRead_buffer(header_buffer,4);
155 while(1){
156 if((header_buffer[0] == 0x11)&&(header_buffer[1] == 0x22)&&(header_buffer[2] == 0x33)&&(header_buffer[3] == 0x44)){
157 break;
158 }
159 MediaSourceRead_buffer(&header_buffer[4],1);
160 header_buffer[0] = header_buffer[1];
161 header_buffer[1] = header_buffer[2];
162 header_buffer[2] = header_buffer[3];
163 header_buffer[3] = header_buffer[4];
164
165 if (*pStop_ReadBuf_Flag==1){
166 ALOGI("Stop_ReadBuf_Flag==1 stop read_buf [%s %d]",__FUNCTION__,__LINE__);
167 return ERROR_END_OF_STREAM;
168 }
169 }
170
171 MediaSourceRead_buffer(header_buffer,2);
172 frame_size = header_buffer[0]<<8 | header_buffer[1];
173 //ALOGI("frame_size = %d \n",frame_size);
174
175 if(frame_size<=0)
176 {
177 ALOGV("WARNING: Invalid frame_size %d \n",frame_size);
178 return ERROR_END_OF_STREAM;
179 }
180
181 MediaBuffer *buffer;
182 status_t err = mGroup->acquire_buffer(&buffer);
183 if (err != OK) {
184 return err;
185 }
186
187 if (MediaSourceRead_buffer((unsigned char*)(buffer->data()),frame_size) != frame_size)
188 {
189 buffer->release();
190 buffer = NULL;
191 return ERROR_END_OF_STREAM;
192 }
193 bytes_readed_sum+=frame_size;
194 buffer->set_range(0, frame_size);
195 buffer->meta_data()->setInt64(kKeyTime, mCurrentTimeUs);
196
197 *out = buffer;
198 return OK;
199}
200
201
202
203
204} // namespace android
205
206