Skip to content

Instantly share code, notes, and snippets.

@dokinkon
Created August 29, 2016 10:49
Show Gist options
  • Save dokinkon/9fcefe64deafa6da3a173769dcf374b2 to your computer and use it in GitHub Desktop.
Save dokinkon/9fcefe64deafa6da3a173769dcf374b2 to your computer and use it in GitHub Desktop.
public class RxMediaRecorder {
public enum State {
INITIAL("initial"),
INITIALIZED("initialized"),
DATASOURCE_CONFIGURED("data_source_configured"),
PREPARED("prepared"),
RECORDING("recording"),
STOPPED("stopped"),
PAUSED("paused"),
PLAYBACK_COMPLETED("completed"),
RELEASED("released"),
ERROR("error");
public final String name;
State(String name) {
this.name = name;
}
}
final BehaviorSubject<State> stateSubject = BehaviorSubject.create(State.INITIAL);
private final MediaRecorder recorder = new MediaRecorder();
public RxMediaRecorder() {
}
public Observable<RxMediaRecorder> setAudioSource(int source) {
return Observable.create(new Observable.OnSubscribe<RxMediaRecorder>() {
@Override
public void call(Subscriber<? super RxMediaRecorder> subscriber) {
recorder.setAudioSource(source);
subscriber.onNext(RxMediaRecorder.this);
changeState(State.INITIALIZED);
}
});
}
public Observable<RxMediaRecorder> setOutputFormat(int format) {
return Observable.create(new Observable.OnSubscribe<RxMediaRecorder>() {
@Override
public void call(Subscriber<? super RxMediaRecorder> subscriber) {
recorder.setOutputFormat(format);
changeState(State.DATASOURCE_CONFIGURED);
subscriber.onNext(RxMediaRecorder.this);
}
});
}
public Observable<RxMediaRecorder> setAudioEncoder(int encoder) {
return Observable.create(new Observable.OnSubscribe<RxMediaRecorder>() {
@Override
public void call(Subscriber<? super RxMediaRecorder> subscriber) {
recorder.setAudioEncoder(encoder);
changeState(State.DATASOURCE_CONFIGURED);
subscriber.onNext(RxMediaRecorder.this);
}
});
}
public Observable<RxMediaRecorder> setAudioChannels(int channels) {
return Observable.create(new Observable.OnSubscribe<RxMediaRecorder>() {
@Override
public void call(Subscriber<? super RxMediaRecorder> subscriber) {
recorder.setAudioChannels(channels);
changeState(State.DATASOURCE_CONFIGURED);
subscriber.onNext(RxMediaRecorder.this);
}
});
}
public Observable<RxMediaRecorder> setAudioEncodingBitRate(int bitRate) {
return Observable.create(new Observable.OnSubscribe<RxMediaRecorder>() {
@Override
public void call(Subscriber<? super RxMediaRecorder> subscriber) {
recorder.setAudioEncodingBitRate(bitRate);
changeState(State.DATASOURCE_CONFIGURED);
subscriber.onNext(RxMediaRecorder.this);
}
});
}
public Observable<RxMediaRecorder> setAudioSamplingRate(int samplingRate) {
return Observable.create(new Observable.OnSubscribe<RxMediaRecorder>() {
@Override
public void call(Subscriber<? super RxMediaRecorder> subscriber) {
recorder.setAudioSamplingRate(samplingRate);
changeState(State.DATASOURCE_CONFIGURED);
subscriber.onNext(RxMediaRecorder.this);
}
});
}
public Observable<RxMediaRecorder> prepare() {
return Observable.create(new Observable.OnSubscribe<RxMediaRecorder>() {
@Override
public void call(Subscriber<? super RxMediaRecorder> subscriber) {
try {
recorder.prepare();
changeState(State.PREPARED);
subscriber.onNext(RxMediaRecorder.this);
} catch (IOException e) {
subscriber.onError(e);
}
}
});
}
public Observable<RxMediaRecorder> start() {
return Observable.create(new Observable.OnSubscribe<RxMediaRecorder>() {
@Override
public void call(Subscriber<? super RxMediaRecorder> subscriber) {
recorder.start();
changeState(State.RECORDING);
subscriber.onNext(RxMediaRecorder.this);
}
});
}
@NonNull
public Observable<RxMediaRecorder> stop() {
return Observable.create(new Observable.OnSubscribe<RxMediaRecorder>() {
@Override
public void call(Subscriber<? super RxMediaRecorder> subscriber) {
recorder.stop();
changeState(State.INITIAL);
subscriber.onNext(RxMediaRecorder.this);
}
});
}
@NonNull
public Observable<RxMediaRecorder> pause() {
return Observable.create(new Observable.OnSubscribe<RxMediaRecorder>() {
@Override
public void call(Subscriber<? super RxMediaRecorder> subscriber) {
}
});
}
@NonNull
public Observable<RxMediaRecorder> reset() {
return Observable.create(new Observable.OnSubscribe<RxMediaRecorder>() {
@Override
public void call(Subscriber<? super RxMediaRecorder> subscriber) {
recorder.reset();
changeState(State.INITIAL);
subscriber.onNext(RxMediaRecorder.this);
}
});
}
public Observable<RxMediaRecorder> release() {
return Observable.create(new Observable.OnSubscribe<RxMediaRecorder>() {
@Override
public void call(Subscriber<? super RxMediaRecorder> subscriber) {
recorder.release();
changeState(State.RELEASED);
subscriber.onNext(RxMediaRecorder.this);
}
});
}
@NonNull
public Observable<State> getStateObs() {
return stateSubject.asObservable();
}
public State getState() {
return stateSubject.getValue();
}
private void changeState(State state) {
if (getState()!=state) {
Timber.v("changeState:" + state.name);
stateSubject.onNext(state);
}
}
}
@dokinkon
Copy link
Author

尚未完成....

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment