summaryrefslogtreecommitdiffstats
path: root/fmapp2
diff options
context:
space:
mode:
authorhimta ram <hram@codeaurora.org>2018-06-14 15:08:50 +0530
committerGerrit - the friendly Code Review server <code-review@localhost>2018-06-16 10:21:12 -0700
commit49c984918cb141284a838c8b952d419a55d22538 (patch)
treecc0a8a5aa38442f22061882dfeec131824eed72c /fmapp2
parentf2067f6c6adb2a51f74cb94fdb7336b9144f151a (diff)
downloadandroid_hardware_qcom_fm-49c984918cb141284a838c8b952d419a55d22538.tar.gz
android_hardware_qcom_fm-49c984918cb141284a838c8b952d419a55d22538.tar.bz2
android_hardware_qcom_fm-49c984918cb141284a838c8b952d419a55d22538.zip
FM: synchronization of RecordSinkThread when ApplicationLoopBack active
Change-Id: I09e409f8597b5be5bc1f8184e2a0cbf8d49a649b
Diffstat (limited to 'fmapp2')
-rw-r--r--fmapp2/src/com/caf/fmradio/FMRadioService.java88
1 files changed, 41 insertions, 47 deletions
diff --git a/fmapp2/src/com/caf/fmradio/FMRadioService.java b/fmapp2/src/com/caf/fmradio/FMRadioService.java
index 944a78c..decf200 100644
--- a/fmapp2/src/com/caf/fmradio/FMRadioService.java
+++ b/fmapp2/src/com/caf/fmradio/FMRadioService.java
@@ -227,7 +227,6 @@ public class FMRadioService extends Service
private AudioTrack mAudioTrack = null;
private boolean mIsRecordSink = false;
private static final int AUDIO_FRAMES_COUNT_TO_IGNORE = 3;
- private Object mRecordSinkLock = new Object();
private Object mEventWaitLock = new Object();
private boolean mIsFMDeviceLoopbackActive = false;
private File mStoragePath = null;
@@ -411,32 +410,34 @@ public class FMRadioService extends Service
createRecordSinkThread();
mIsRecordSink = true;
- synchronized (mRecordSinkLock) {
- mRecordSinkLock.notify();
- }
}
- private synchronized void stopRecordSink() {
- Log.d(LOGTAG, "stopRecordSink");
- mIsRecordSink = false;
- synchronized (mRecordSinkLock) {
- mRecordSinkLock.notify();
- }
- }
-
private synchronized void createRecordSinkThread() {
if (mRecordSinkThread == null) {
mRecordSinkThread = new RecordSinkThread();
mRecordSinkThread.start();
+ Log.d(LOGTAG, "mRecordSinkThread started");
}
}
private synchronized void exitRecordSinkThread() {
- stopRecordSink();
- if (mRecordSinkThread != null) {
- mRecordSinkThread.interrupt();
+ if(isRecordSinking()) {
+ Log.d(LOGTAG, "stopRecordSink");
+ mIsRecordSink = false;
+ } else {
+ Log.d(LOGTAG, "exitRecordSinkThread called mRecordSinkThread not running");
+ return;
+ }
+ try {
+ Log.d(LOGTAG, "stopRecordSink waiting to join mRecordSinkThread");
+ mRecordSinkThread.join();
+ } catch (InterruptedException e) {
+ Log.d(LOGTAG, "Exceprion while mRecordSinkThread join");
}
mRecordSinkThread = null;
+ mAudioTrack = null;
+ mAudioRecord = null;
+ Log.d(LOGTAG, "exitRecordSinkThread completed");
}
private boolean isRecordSinking() {
@@ -452,21 +453,21 @@ public class FMRadioService extends Service
@Override
public void run() {
try {
+ Log.d(LOGTAG, "RecordSinkThread: run started ");
byte[] buffer = new byte[FM_RECORD_BUF_SIZE];
- while (!Thread.interrupted()) {
- if (isRecordSinking()) {
+ while (isRecordSinking()) {
// Speaker mode or BT a2dp mode will come here and keep reading and writing.
// If we want FM sound output from speaker or BT a2dp, we must record data
// to AudioRecrd and write data to AudioTrack.
if (mAudioRecord.getRecordingState() == AudioRecord.RECORDSTATE_STOPPED) {
mAudioRecord.startRecording();
- Log.d(LOGTAG, "mAudioRecord.startRecording started");
+ Log.d(LOGTAG, "RecordSinkThread: mAudioRecord.startRecording started");
}
if (mAudioTrack.getPlayState() == AudioTrack.PLAYSTATE_STOPPED) {
- Log.d(LOGTAG, "mAudioTrack.play executed");
+ Log.d(LOGTAG, "RecordSinkThread: mAudioTrack.play executed");
mAudioTrack.play();
- Log.d(LOGTAG, "mAudioTrack.play completed");
+ Log.d(LOGTAG, "RecordSinkThread: mAudioTrack.play completed");
}
int size = mAudioRecord.read(buffer, 0, FM_RECORD_BUF_SIZE);
// check whether need to ignore first 3 frames audio data from AudioRecord
@@ -486,32 +487,25 @@ public class FMRadioService extends Service
// while AudioRecord is reading.
if (isRecordSinking()) {
mAudioTrack.write(tmpBuf, 0, tmpBuf.length);
+ } else {
+ mCurrentFrame = 0;
+ Log.d(LOGTAG, "RecordSinkThread: stopRecordSink called stopping mAudioTrack and mAudioRecord ");
+ break;
}
- } else {
- // Earphone mode will come here and wait.
- mCurrentFrame = 0;
-
- if (mAudioTrack.getPlayState() == AudioTrack.PLAYSTATE_PLAYING) {
- mAudioTrack.stop();
- }
-
- if (mAudioRecord.getRecordingState() == AudioRecord.RECORDSTATE_RECORDING) {
- mAudioRecord.stop();
- }
-
- synchronized (mRecordSinkLock) {
- mRecordSinkLock.wait();
- }
- }
}
- } catch (InterruptedException e) {
+ } catch (Exception e) {
Log.d(LOGTAG, "RecordSinkThread.run, thread is interrupted, need exit thread");
} finally {
+ Log.d(LOGTAG, "RecordSinkThread: stopRecordSink called stopping mAudioTrack and mAudioRecord ");
if (mAudioRecord.getRecordingState() == AudioRecord.RECORDSTATE_RECORDING) {
+ Log.d(LOGTAG, "RecordSinkThread: mAudioRecord.stop()");
mAudioRecord.stop();
+ Log.d(LOGTAG, "RecordSinkThread: mAudioRecord.stop() completed");
}
if (mAudioTrack.getPlayState() == AudioTrack.PLAYSTATE_PLAYING) {
+ Log.d(LOGTAG, "RecordSinkThread: mAudioTrack.stop();");
mAudioTrack.stop();
+ Log.d(LOGTAG, "RecordSinkThread:mAudioTrack.stop() completed");
}
}
}
@@ -725,15 +719,15 @@ public class FMRadioService extends Service
if (!bA2dpConnected) {
Log.d(LOGTAG, "A2DP device is dis-connected!");
//stop record session of audio and switch to default audio output device
- // getOutputDeviceAndSwitchAudio(AudioDeviceInfo.TYPE_WIRED_HEADSET);
+ // startApplicationLoopBack(AudioDeviceInfo.TYPE_WIRED_HEADSET);
} else {
Log.d(LOGTAG, "A2DP device is connected!");
if (mSpeakerPhoneOn) {
Log.d(LOGTAG, "route audio to speaker");
- getOutputDeviceAndSwitchAudio(AudioDeviceInfo.TYPE_BUILTIN_SPEAKER);
+ startApplicationLoopBack(AudioDeviceInfo.TYPE_BUILTIN_SPEAKER);
} else {
Log.d(LOGTAG, "route audio to wiredHeadset");
- getOutputDeviceAndSwitchAudio(AudioDeviceInfo.TYPE_WIRED_HEADSET);
+ startApplicationLoopBack(AudioDeviceInfo.TYPE_WIRED_HEADSET);
}
}
} else if (action.equals("HDMI_CONNECTED")) {
@@ -1178,9 +1172,9 @@ public class FMRadioService extends Service
String temp = mSpeakerPhoneOn ? "Speaker" : "WiredHeadset";
Log.d(LOGTAG, "Route audio to " + temp);
if(!mSpeakerPhoneOn) {
- getOutputDeviceAndSwitchAudio(AudioDeviceInfo.TYPE_WIRED_HEADSET);
+ startApplicationLoopBack(AudioDeviceInfo.TYPE_WIRED_HEADSET);
} else {
- getOutputDeviceAndSwitchAudio(AudioDeviceInfo.TYPE_BUILTIN_SPEAKER);
+ startApplicationLoopBack(AudioDeviceInfo.TYPE_BUILTIN_SPEAKER);
}
}
mPlaybackInProgress = true;
@@ -2548,7 +2542,7 @@ public class FMRadioService extends Service
if (isSpeakerEnabled() == true) {
if (mA2dpConnected == true) {
Log.d(LOGTAG, "A2DP connected, resetAudioRoute to wiredHeadset");
- getOutputDeviceAndSwitchAudio(AudioDeviceInfo.TYPE_WIRED_HEADSET);
+ startApplicationLoopBack(AudioDeviceInfo.TYPE_WIRED_HEADSET);
}
}
}
@@ -2761,10 +2755,10 @@ public class FMRadioService extends Service
if (speakerOn == false) {
Log.d(LOGTAG, "route audio to wired headset");
- getOutputDeviceAndSwitchAudio(AudioDeviceInfo.TYPE_WIRED_HEADSET);
+ startApplicationLoopBack(AudioDeviceInfo.TYPE_WIRED_HEADSET);
} else if (speakerOn == true) {
Log.d(LOGTAG, "enabling speaker");
- getOutputDeviceAndSwitchAudio(AudioDeviceInfo.TYPE_BUILTIN_SPEAKER);
+ startApplicationLoopBack(AudioDeviceInfo.TYPE_BUILTIN_SPEAKER);
}
Log.d(LOGTAG, "speakerOn completed:" + speakerOn);
@@ -4232,10 +4226,10 @@ public class FMRadioService extends Service
//TODO unregister the fm service here.
}
}
- private boolean getOutputDeviceAndSwitchAudio(int deviceType) {
+ private boolean startApplicationLoopBack(int deviceType) {
// stop existing playback path before starting new one
- Log.d(LOGTAG,"getOutputDeviceAndSwitchAudio for device "+deviceType);
+ Log.d(LOGTAG,"startApplicationLoopBack for device "+deviceType);
AudioDeviceInfo outputDevice = null;
AudioDeviceInfo[] deviceList = mAudioManager.getDevices(AudioManager.GET_DEVICES_OUTPUTS);