Skip to content

Repository files navigation

RxAndroidAudio

Android Audio encapsulation library, with part Rx support.

Download

Usage

About lambda support

This library use lambda expression, since com.android.tools.build:gradle:2.4.0, there is native support for lambda, so I use it instead of jack support or RetroLambda, if you have lambda issue during build, please upgrade your gradle-android into 2.4.0+, or use 1.5.1 of this library, thanks!

Add to gradle dependency of your module build.gradle:

allprojects {
repositories {
maven {
url "http://dl.bintray.com/piasy/maven"
}
}
}
dependencies {
compile 'com.github.piasy:rxandroidaudio:1.5.2'
compile 'com.github.piasy:AudioProcessor:1.5.2'
}

Use in code:

Record to file:

mAudioRecorder = AudioRecorder.getInstance();
mAudioFile = newFile(
Environment.getExternalStorageDirectory().getAbsolutePath() +
File.separator + System.nanoTime() + ".file.m4a");
mAudioRecorder.prepareRecord(MediaRecorder.AudioSource.MIC,
MediaRecorder.OutputFormat.MPEG_4, MediaRecorder.AudioEncoder.AAC,
mAudioFile);
mAudioRecorder.startRecord();
// ...mAudioRecorder.stopRecord();

Note: If you record a aac file, the sound quality will be poor if the sample rate and encoding bit rate is low, the sound quality will increase when you set a bigger sample rate and encoding bit rate, but as the sound quality improve, the recorded file size will also increase.

Play a file

With PlayConfig, to set audio file or audio resource, set volume, or looping:

mRxAudioPlayer.play(PlayConfig.file(audioFile).looping(true).build())
.subscribeOn(Schedulers.io())
.subscribe(newObserver<Boolean>() {
@OverridepublicvoidonSubscribe(finalDisposabledisposable) {
}
@OverridepublicvoidonNext(finalBooleanaBoolean) {
// prepared
}
@OverridepublicvoidonError(finalThrowablethrowable) {
}
@OverridepublicvoidonComplete() {
// play finished// NOTE: if looping, the Observable will never finish, you need stop playing// onDestroy, otherwise, memory leak will happen!
}
});

Full example of PlayConfig

PlayConfig.file(audioFile) // play a local file//.res(getApplicationContext(), R.raw.audio_record_end) // or play a raw resource
.looping(true) // loop or not
.leftVolume(1.0F) // left volume
.rightVolume(1.0F) // right volume
.build(); // build this config and play!

Record a stream:

mOutputFile = newFile(Environment.getExternalStorageDirectory().getAbsolutePath() +
File.separator + System.nanoTime() + ".stream.m4a");
mOutputFile.createNewFile();
mFileOutputStream = newFileOutputStream(mOutputFile);
mStreamAudioRecorder.start(newStreamAudioRecorder.AudioDataCallback() {
@OverridepublicvoidonAudioData(byte[] data, intsize) {
if (mFileOutputStream != null) {
try {
mFileOutputStream.write(data, 0, size);
} catch (IOExceptione) {
e.printStackTrace();
}
}
}
@OverridepublicvoidonError() {
mBtnStart.post(newRunnable() {
@Overridepublicvoidrun() {
Toast.makeText(getApplicationContext(), "Record fail",
Toast.LENGTH_SHORT).show();
mBtnStart.setText("Start");
mIsRecording = false;
}
});
}
});

Play a stream:

Observable.just(mOutputFile).subscribeOn(Schedulers.io()).subscribe(newAction1<File>() {
@Overridepublicvoidcall(Filefile) {
try {
mStreamAudioPlayer.init();
FileInputStreaminputStream = newFileInputStream(file);
intread;
while ((read = inputStream.read(mBuffer)) > 0) {
mStreamAudioPlayer.play(mBuffer, read);
}
inputStream.close();
mStreamAudioPlayer.release();
} catch (IOExceptione) {
e.printStackTrace();
}
}
});

Change the sound effect in stream mode:

mStreamAudioPlayer.play(
mAudioProcessor.process(mRatio, mBuffer, StreamAudioRecorder.DEFAULT_SAMPLE_RATE),
len);

See full example for more details.

Download demo apk.

Contribution are welcome!

About

Maybe the most robust Android Audio encapsulation library, with partial Rx support.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages