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 | |
8 | extern "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 | |
16 | namespace android { |
17 | |
18 | int 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 | } |
32 | int 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 | //------------------------------------------------------------------------- |
62 | ALAC_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 | } |
80 | ALAC_MediaSource::~ALAC_MediaSource() |
81 | { |
82 | ALOGI("[%s] in line (%d) \n",__FUNCTION__,__LINE__); |
83 | if (mStarted) |
84 | stop(); |
85 | } |
86 | int ALAC_MediaSource::GetSampleRate() |
87 | { |
88 | return sample_rate; |
89 | } |
90 | |
91 | int ALAC_MediaSource::GetChNum() |
92 | { |
93 | return ChNum; |
94 | } |
95 | |
96 | int* ALAC_MediaSource::Get_pStop_ReadBuf_Flag() |
97 | { |
98 | return pStop_ReadBuf_Flag; |
99 | } |
100 | |
101 | int ALAC_MediaSource::Set_pStop_ReadBuf_Flag(int *pStop) |
102 | { |
103 | pStop_ReadBuf_Flag = pStop; |
104 | return 0; |
105 | } |
106 | |
107 | int 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 | |
120 | sp<MetaData> ALAC_MediaSource::getFormat() { |
121 | ALOGI("[%s] in line (%d) \n",__FUNCTION__,__LINE__); |
122 | return mMeta; |
123 | } |
124 | |
125 | status_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 | |
134 | status_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 | |
143 | status_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 |