11package io .agora .api .example .examples .advanced ;
22
33import android .content .Context ;
4- import android .media .AudioFormat ;
5- import android .media .AudioManager ;
64import android .os .Bundle ;
75import android .os .Handler ;
86import android .text .TextUtils ;
2119import com .yanzhenjie .permission .AndPermission ;
2220import com .yanzhenjie .permission .runtime .Permission ;
2321
22+ import java .io .IOException ;
23+ import java .io .InputStream ;
24+ import java .nio .ByteBuffer ;
25+
2426import io .agora .api .example .R ;
2527import io .agora .api .example .annotation .Example ;
2628import io .agora .api .example .common .BaseFragment ;
27- import io .agora .api .example .examples .advanced .customaudio .AudioPlayer ;
2829import io .agora .api .example .utils .CommonUtil ;
2930import io .agora .rtc .AudioFrame ;
3031import io .agora .rtc .Constants ;
@@ -53,15 +54,17 @@ public class ProcessAudioRawData extends BaseFragment implements View.OnClickLis
5354 private static final String TAG = ProcessAudioRawData .class .getSimpleName ();
5455 private EditText et_channel ;
5556 private Button mute , join , speaker ;
56- private Switch loopback ;
57+ private Switch writeBackAudio ;
5758 private RtcEngine engine ;
5859 private int myUid ;
5960 private boolean joined = false ;
60- private boolean isEnableLoopBack = false ;
61- private AudioPlayer mAudioPlayer ;
61+ private boolean isWriteBackAudio = false ;
6262 private static final Integer SAMPLE_RATE = 44100 ;
63+ private static final Integer SAMPLE_NUM_OF_CHANNEL = 2 ;
64+ private static final Integer BIT_PER_SAMPLE = 16 ;
6365 private static final Integer SAMPLES_PER_CALL = 4410 ;
64- private static final Integer SAMPLE_NUM_OF_CHANNEL = 1 ;
66+ private static final String AUDIO_FILE = "output.raw" ;
67+ private InputStream inputStream ;
6568
6669 @ Override
6770 public void onCreate (@ Nullable Bundle savedInstanceState ) {
@@ -86,8 +89,8 @@ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceStat
8689 mute .setOnClickListener (this );
8790 speaker = view .findViewById (R .id .btn_speaker );
8891 speaker .setOnClickListener (this );
89- loopback = view .findViewById (R .id .loopback );
90- loopback .setOnCheckedChangeListener (this );
92+ writeBackAudio = view .findViewById (R .id .audioWriteBack );
93+ writeBackAudio .setOnCheckedChangeListener (this );
9194 }
9295
9396 @ Override
@@ -115,7 +118,7 @@ public void onActivityCreated(@Nullable Bundle savedInstanceState) {
115118 * - < 0: Failure.
116119 */
117120 engine .registerAudioFrameObserver (audioFrameObserver );
118- mAudioPlayer = new AudioPlayer ( AudioManager . STREAM_VOICE_CALL , SAMPLE_RATE , SAMPLE_NUM_OF_CHANNEL , AudioFormat . CHANNEL_OUT_MONO );
121+ openAudioFile ( );
119122 }
120123 catch (Exception e ) {
121124 e .printStackTrace ();
@@ -132,7 +135,45 @@ public void onDestroy() {
132135 }
133136 handler .post (RtcEngine ::destroy );
134137 engine = null ;
135- mAudioPlayer .stopPlayer ();
138+ closeAudioFile ();
139+ }
140+
141+ private void openAudioFile (){
142+ try {
143+ inputStream = this .getResources ().getAssets ().open (AUDIO_FILE );
144+ } catch (IOException e ) {
145+ e .printStackTrace ();
146+ }
147+ }
148+
149+ private void closeAudioFile (){
150+ try {
151+ inputStream .close ();
152+ } catch (IOException e ) {
153+ e .printStackTrace ();
154+ }
155+ }
156+
157+ private byte [] readBuffer (){
158+ int byteSize = SAMPLES_PER_CALL * BIT_PER_SAMPLE / 8 * SAMPLE_NUM_OF_CHANNEL ;
159+ byte [] buffer = new byte [byteSize ];
160+ try {
161+ if (inputStream .read (buffer ) < 0 ){
162+ inputStream .reset ();
163+ return readBuffer ();
164+ }
165+ } catch (IOException e ) {
166+ e .printStackTrace ();
167+ }
168+ return buffer ;
169+ }
170+
171+ private byte [] audioAggregate (byte [] origin , byte [] buffer ) {
172+ byte [] output = new byte [origin .length ];
173+ for (int i = 0 ; i < origin .length ; i ++) {
174+ output [i ] = (byte ) ((int ) origin [i ] + (int ) buffer [i ] / 2 );
175+ }
176+ return output ;
136177 }
137178
138179 @ Override
@@ -282,7 +323,6 @@ public void onLeaveChannel(RtcStats stats) {
282323 public void onJoinChannelSuccess (String channel , int uid , int elapsed ) {
283324 Log .i (TAG , String .format ("onJoinChannelSuccess channel %s uid %d" , channel , uid ));
284325 showLongToast (String .format ("onJoinChannelSuccess channel %s uid %d" , channel , uid ));
285- mAudioPlayer .startPlayer ();
286326 myUid = uid ;
287327 joined = true ;
288328 handler .post (new Runnable () {
@@ -292,7 +332,7 @@ public void run() {
292332 mute .setEnabled (true );
293333 join .setEnabled (true );
294334 join .setText (getString (R .string .leave ));
295- loopback .setEnabled (true );
335+ writeBackAudio .setEnabled (true );
296336 }
297337 });
298338 }
@@ -372,7 +412,16 @@ public void onActiveSpeaker(int uid) {
372412 private final IAudioFrameObserver audioFrameObserver = new IAudioFrameObserver () {
373413 @ Override
374414 public boolean onRecordFrame (AudioFrame audioFrame ) {
375- return false ;
415+ Log .i (TAG , "onRecordAudioFrame " + isWriteBackAudio );
416+ if (isWriteBackAudio ){
417+ ByteBuffer byteBuffer = audioFrame .samples ;
418+ byte [] buffer = readBuffer ();
419+ byte [] origin = new byte [byteBuffer .remaining ()];
420+ byteBuffer .get (origin );
421+ byteBuffer .flip ();
422+ byteBuffer .put (audioAggregate (origin , buffer ), 0 , byteBuffer .remaining ());
423+ }
424+ return true ;
376425 }
377426
378427 @ Override
@@ -402,12 +451,12 @@ public boolean onPlaybackFrameBeforeMixingEx(AudioFrame audioFrame, int uid, Str
402451
403452 @ Override
404453 public int getObservedAudioFramePosition () {
405- return 0 ;
454+ return IAudioFrameObserver . POSITION_RECORD ;
406455 }
407456
408457 @ Override
409458 public AudioParams getRecordAudioParams () {
410- return new AudioParams (SAMPLE_RATE , SAMPLE_NUM_OF_CHANNEL , Constants .RAW_AUDIO_FRAME_OP_MODE_READ_ONLY , SAMPLES_PER_CALL );
459+ return new AudioParams (SAMPLE_RATE , SAMPLE_NUM_OF_CHANNEL , Constants .RAW_AUDIO_FRAME_OP_MODE_READ_WRITE , SAMPLES_PER_CALL );
411460 }
412461
413462 @ Override
@@ -423,6 +472,6 @@ public AudioParams getMixedAudioParams() {
423472
424473 @ Override
425474 public void onCheckedChanged (CompoundButton compoundButton , boolean b ) {
426- isEnableLoopBack = b ;
475+ isWriteBackAudio = b ;
427476 }
428477}
0 commit comments