@@ -150,9 +150,9 @@ static int AndroidRecorderCallback(void *userData)
150150{
151151 struct android_aud_stream * stream = (struct android_aud_stream * )userData ;
152152 jmethodID read_method = 0 , record_method = 0 , stop_method = 0 ;
153- int size = stream -> rec_buf_size ;
154- jbyteArray inputBuffer ;
155- jbyte * buf ;
153+ int size = stream -> rec_buf_size / 2 ;
154+ jshortArray inputBuffer ;
155+ jshort * buf ;
156156 JNIEnv * jni_env = 0 ;
157157 pj_bool_t attached = attach_jvm (& jni_env );
158158
@@ -166,7 +166,7 @@ static int AndroidRecorderCallback(void *userData)
166166
167167 /* Get methods ids */
168168 read_method = (* jni_env )-> GetMethodID (jni_env , stream -> record_class ,
169- "read" , "([BII )I" );
169+ "read" , "([SII )I" );
170170 record_method = (* jni_env )-> GetMethodID (jni_env , stream -> record_class ,
171171 "startRecording" , "()V" );
172172 stop_method = (* jni_env )-> GetMethodID (jni_env , stream -> record_class ,
@@ -177,7 +177,7 @@ static int AndroidRecorderCallback(void *userData)
177177 }
178178
179179 /* Create a buffer for frames read */
180- inputBuffer = (* jni_env )-> NewByteArray (jni_env , size );
180+ inputBuffer = (* jni_env )-> NewShortArray (jni_env , size );
181181 if (inputBuffer == 0 ) {
182182 PJ_LOG (3 , (THIS_FILE , "Unable to allocate input buffer" ));
183183 goto on_return ;
@@ -190,7 +190,7 @@ static int AndroidRecorderCallback(void *userData)
190190 while (!stream -> quit_flag ) {
191191 pjmedia_frame frame ;
192192 pj_status_t status ;
193- int bytesRead ;
193+ int shortRead ;
194194
195195 if (!stream -> running ) {
196196 (* jni_env )-> CallVoidMethod (jni_env , stream -> record , stop_method );
@@ -200,25 +200,25 @@ static int AndroidRecorderCallback(void *userData)
200200 (* jni_env )-> CallVoidMethod (jni_env , stream -> record , record_method );
201201 }
202202
203- bytesRead = (* jni_env )-> CallIntMethod (jni_env , stream -> record ,
203+ shortRead = (* jni_env )-> CallIntMethod (jni_env , stream -> record ,
204204 read_method , inputBuffer ,
205205 0 , size );
206- if (bytesRead <= 0 || bytesRead != size ) {
206+ if (shortRead <= 0 || shortRead != size ) {
207207 PJ_LOG (4 , (THIS_FILE , "Record thread : error %d reading data" ,
208- bytesRead ));
208+ shortRead ));
209209 continue ;
210210 }
211211
212- buf = (* jni_env )-> GetByteArrayElements (jni_env , inputBuffer , 0 );
212+ buf = (* jni_env )-> GetShortArrayElements (jni_env , inputBuffer , 0 );
213213 frame .type = PJMEDIA_FRAME_TYPE_AUDIO ;
214- frame .size = size ;
214+ frame .size = stream -> rec_buf_size ;
215215 frame .bit_info = 0 ;
216216 frame .buf = (void * )buf ;
217217 frame .timestamp .u64 = stream -> rec_timestamp .u64 ;
218218
219219 status = (* stream -> rec_cb )(stream -> user_data , & frame );
220- (* jni_env )-> ReleaseByteArrayElements (jni_env , inputBuffer , buf ,
221- JNI_ABORT );
220+ (* jni_env )-> ReleaseShortArrayElements (jni_env , inputBuffer , buf ,
221+ JNI_ABORT );
222222 if (status != PJ_SUCCESS || stream -> quit_flag )
223223 break ;
224224
@@ -241,9 +241,9 @@ static int AndroidTrackCallback(void *userData)
241241{
242242 struct android_aud_stream * stream = (struct android_aud_stream * ) userData ;
243243 jmethodID write_method = 0 , play_method = 0 , stop_method = 0 , flush_method = 0 ;
244- int size = stream -> play_buf_size ;
245- jbyteArray outputBuffer ;
246- jbyte * buf ;
244+ int size = stream -> play_buf_size / 2 ;
245+ jshortArray outputBuffer ;
246+ jshort * buf ;
247247 JNIEnv * jni_env = 0 ;
248248 pj_bool_t attached = attach_jvm (& jni_env );
249249
@@ -255,7 +255,7 @@ static int AndroidTrackCallback(void *userData)
255255
256256 /* Get methods ids */
257257 write_method = (* jni_env )-> GetMethodID (jni_env , stream -> track_class ,
258- "write" , "([BII )I" );
258+ "write" , "([SII )I" );
259259 play_method = (* jni_env )-> GetMethodID (jni_env , stream -> track_class ,
260260 "play" , "()V" );
261261 stop_method = (* jni_env )-> GetMethodID (jni_env , stream -> track_class ,
@@ -269,12 +269,12 @@ static int AndroidTrackCallback(void *userData)
269269 goto on_return ;
270270 }
271271
272- outputBuffer = (* jni_env )-> NewByteArray (jni_env , size );
272+ outputBuffer = (* jni_env )-> NewShortArray (jni_env , size );
273273 if (outputBuffer == 0 ) {
274274 PJ_LOG (3 , (THIS_FILE , "Unable to allocate output buffer" ));
275275 goto on_return ;
276276 }
277- buf = (* jni_env )-> GetByteArrayElements (jni_env , outputBuffer , 0 );
277+ buf = (* jni_env )-> GetShortArrayElements (jni_env , outputBuffer , 0 );
278278
279279 /* Start playing */
280280 pj_thread_set_prio (NULL , THREAD_PRIORITY_URGENT_AUDIO );
@@ -283,7 +283,7 @@ static int AndroidTrackCallback(void *userData)
283283 while (!stream -> quit_flag ) {
284284 pjmedia_frame frame ;
285285 pj_status_t status ;
286- int bytesWritten ;
286+ int shortWritten ;
287287
288288 if (!stream -> running ) {
289289 (* jni_env )-> CallVoidMethod (jni_env , stream -> track , stop_method );
@@ -295,7 +295,7 @@ static int AndroidTrackCallback(void *userData)
295295 }
296296
297297 frame .type = PJMEDIA_FRAME_TYPE_AUDIO ;
298- frame .size = size ;
298+ frame .size = stream -> play_buf_size ;
299299 frame .buf = (void * )buf ;
300300 frame .timestamp .u64 = stream -> play_timestamp .u64 ;
301301 frame .bit_info = 0 ;
@@ -307,24 +307,24 @@ static int AndroidTrackCallback(void *userData)
307307 if (frame .type != PJMEDIA_FRAME_TYPE_AUDIO )
308308 pj_bzero (frame .buf , frame .size );
309309
310- (* jni_env )-> ReleaseByteArrayElements (jni_env , outputBuffer , buf ,
310+ (* jni_env )-> ReleaseShortArrayElements (jni_env , outputBuffer , buf ,
311311 JNI_COMMIT );
312312
313313 /* Write to the device output. */
314- bytesWritten = (* jni_env )-> CallIntMethod (jni_env , stream -> track ,
314+ shortWritten = (* jni_env )-> CallIntMethod (jni_env , stream -> track ,
315315 write_method , outputBuffer ,
316316 0 , size );
317- if (bytesWritten <= 0 || bytesWritten != size ) {
317+ if (shortWritten <= 0 || shortWritten != size ) {
318318 PJ_LOG (4 , (THIS_FILE , "Player thread: Error %d writing data" ,
319- bytesWritten ));
319+ shortWritten ));
320320 continue ;
321321 }
322322
323323 stream -> play_timestamp .u64 += stream -> param .samples_per_frame /
324324 stream -> param .channel_count ;
325325 };
326326
327- (* jni_env )-> ReleaseByteArrayElements (jni_env , outputBuffer , buf , 0 );
327+ (* jni_env )-> ReleaseShortArrayElements (jni_env , outputBuffer , buf , 0 );
328328 (* jni_env )-> DeleteLocalRef (jni_env , outputBuffer );
329329
330330on_return :
@@ -476,7 +476,8 @@ static pj_status_t android_create_stream(pjmedia_aud_dev_factory *f,
476476
477477 PJ_ASSERT_RETURN (param -> channel_count >= 1 && param -> channel_count <= 2 ,
478478 PJ_EINVAL );
479- PJ_ASSERT_RETURN (param -> bits_per_sample == 8 || param -> bits_per_sample == 16 ,
479+ PJ_ASSERT_RETURN (/* param->bits_per_sample==8 || */
480+ param -> bits_per_sample == 16 ,
480481 PJ_EINVAL );
481482 PJ_ASSERT_RETURN (play_cb && rec_cb && p_aud_strm , PJ_EINVAL );
482483
@@ -500,8 +501,11 @@ static pj_status_t android_create_stream(pjmedia_aud_dev_factory *f,
500501 12 /*CHANNEL_IN_STEREO*/ ;
501502 channelOutCfg = (param -> channel_count == 1 )? 4 /*CHANNEL_OUT_MONO*/ :
502503 12 /*CHANNEL_OUT_STEREO*/ ;
503- sampleFormat = (param -> bits_per_sample == 8 )? 3 /*ENCODING_PCM_8BIT*/ :
504- 2 /*ENCODING_PCM_16BIT*/ ;
504+
505+ // The 8bit/byte read/write methods no longer support 16bit
506+ //sampleFormat = (param->bits_per_sample == 8)? 3 /*ENCODING_PCM_8BIT*/:
507+ // 2 /*ENCODING_PCM_16BIT*/;
508+ sampleFormat = 2 /*ENCODING_PCM_16BIT*/ ;
505509
506510 attached = attach_jvm (& jni_env );
507511
0 commit comments