private void setError(int error) { if (mOnErrorListener != null) { mOnErrorListener.onError(error); } }
public static Builder file(File file) { Builder builder = new Builder(); builder.mAudioFile = file; builder.mType = TYPE_FILE; return builder; }
public synchronized void init() { init(DEFAULT_SAMPLE_RATE, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT, StreamAudioRecorder.DEFAULT_BUFFER_SIZE); }
/** * prepare audio from local file. should be scheduled in IO thread. */ public Observable<Boolean> prepare(@NonNull final PlayConfig config) { if (!config.isArgumentValid() || !config.isLocalSource()) { return Observable.error(new IllegalArgumentException("")); } return Observable.<Boolean>create(emitter -> { MediaPlayer player = create(config); setMediaPlayerListener(player, emitter); player.setVolume(config.mLeftVolume, config.mRightVolume); player.setAudioStreamType(config.mStreamType); player.setLooping(config.mLooping); if (config.needPrepare()) { player.prepare(); } mPlayer = player; emitter.onNext(true); }).doOnError(e -> stopPlay()); }
@OnClick(R.id.mBtnPlay) public void startPlay() { mTvLog.setText(""); if (!mAudioFiles.isEmpty()) { File audioFile = mAudioFiles.poll(); compositeDisposable.add(mRxAudioPlayer.play( PlayConfig.file(audioFile) .streamType(AudioManager.STREAM_VOICE_CALL) .build()) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(Functions.emptyConsumer(), Throwable::printStackTrace, this::startPlay)); } }
} catch (IllegalStateException e) { Log.w(TAG, "startRecording fail: " + e.getMessage()); mAudioDataCallback.onError(); return; ret = mAudioRecord.read(mShortBuffer, 0, mShortBufferSize); if (ret > 0) { mAudioDataCallback.onAudioData( short2byte(mShortBuffer, ret, mByteBuffer), ret * 2); } else { onError(ret); break; ret = mAudioRecord.read(mByteBuffer, 0, mByteBufferSize); if (ret > 0) { mAudioDataCallback.onAudioData(mByteBuffer, ret); } else { onError(ret); break;
/** * AudioFormat.CHANNEL_IN_MONO * AudioFormat.ENCODING_PCM_16BIT */ public synchronized boolean start(int sampleRate, int channelConfig, int audioFormat, int bufferSize, @NonNull AudioDataCallback audioDataCallback) { stop(); mExecutorService = Executors.newSingleThreadExecutor(); if (mIsRecording.compareAndSet(false, true)) { mExecutorService.execute( new AudioRecordRunnable(sampleRate, channelConfig, audioFormat, bufferSize, audioDataCallback)); return true; } return false; }
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_stream); ButterKnife.bind(this); mRatioBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { mRatio = (float) progress / 100; mRatioValue.setText(String.valueOf(mRatio)); } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onStopTrackingTouch(SeekBar seekBar) { } }); mStreamAudioRecorder = StreamAudioRecorder.getInstance(); mStreamAudioPlayer = StreamAudioPlayer.getInstance(); mAudioProcessor = new AudioProcessor(BUFFER_SIZE); mBuffer = new byte[BUFFER_SIZE]; }
public static Observable<Integer> from(@NonNull final AudioRecorder audioRecorder, long interval) { return new RxAmplitude().start(audioRecorder, interval); }
public synchronized boolean start(@NonNull AudioDataCallback audioDataCallback) { return start(DEFAULT_SAMPLE_RATE, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, DEFAULT_BUFFER_SIZE, audioDataCallback); }
public static Observable<Integer> from(@NonNull AudioRecorder audioRecorder) { return from(audioRecorder, DEFAULT_AMPLITUDE_INTERVAL); }
private void stopRecord() { mStreamAudioRecorder.stop(); try { mFileOutputStream.close(); mFileOutputStream = null; } catch (IOException e) { e.printStackTrace(); } }
/** * prepare for a new audio record, with default sample rate and bit rate. */ @WorkerThread public synchronized boolean prepareRecord(int audioSource, int outputFormat, int audioEncoder, File outputFile) { return prepareRecord(audioSource, outputFormat, audioEncoder, DEFAULT_SAMPLE_RATE, DEFAULT_BIT_RATE, outputFile); }
@Override protected void onDestroy() { super.onDestroy(); if (mRxAudioPlayer != null) { mRxAudioPlayer.stopPlay(); } compositeDisposable.dispose(); }
public PlayConfig build() { return new PlayConfig(this); } }
private void onError(int errorCode) { if (errorCode == AudioRecord.ERROR_INVALID_OPERATION) { Log.w(TAG, "record fail: ERROR_INVALID_OPERATION"); mAudioDataCallback.onError(); } else if (errorCode == AudioRecord.ERROR_BAD_VALUE) { Log.w(TAG, "record fail: ERROR_BAD_VALUE"); mAudioDataCallback.onError(); } } }
/** * play audio from local file. should be scheduled in IO thread. */ public Observable<Boolean> play(@NonNull final PlayConfig config) { if (!config.isArgumentValid()) { return Observable.error(new IllegalArgumentException("")); } return Observable.<Boolean>create(emitter -> { MediaPlayer player = create(config); setMediaPlayerListener(player, emitter); player.setVolume(config.mLeftVolume, config.mRightVolume); player.setAudioStreamType(config.mStreamType); player.setLooping(config.mLooping); if (config.needPrepare()) { player.prepare(); } player.start(); mPlayer = player; emitter.onNext(true); }).doOnError(e -> stopPlay()); }
public static Builder uri(Context context, Uri uri) { Builder builder = new Builder(); builder.mContext = context; builder.mUri = uri; builder.mType = TYPE_URI; return builder; }
public static Builder url(String url) { Builder builder = new Builder(); builder.mUrl = url; builder.mType = TYPE_URL; return builder; }
public static Builder res(Context context, @RawRes int audioResource) { Builder builder = new Builder(); builder.mContext = context; builder.mAudioResource = audioResource; builder.mType = TYPE_RES; return builder; }