summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--core/jni/android_media_AudioRecord.cpp8
-rw-r--r--libs/audioflinger/AudioFlinger.cpp55
-rw-r--r--libs/audioflinger/AudioFlinger.h1
-rw-r--r--media/java/android/media/AudioRecord.java7
-rw-r--r--media/libmedia/AudioRecord.cpp3
-rw-r--r--media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/performance/MediaPlayerPerformance.java67
6 files changed, 81 insertions, 60 deletions
diff --git a/core/jni/android_media_AudioRecord.cpp b/core/jni/android_media_AudioRecord.cpp
index 0be996d..d7485ae 100644
--- a/core/jni/android_media_AudioRecord.cpp
+++ b/core/jni/android_media_AudioRecord.cpp
@@ -224,17 +224,17 @@ native_track_failure:
// ----------------------------------------------------------------------------
-static void
+static int
android_media_AudioRecord_start(JNIEnv *env, jobject thiz)
{
AudioRecord *lpRecorder =
(AudioRecord *)env->GetIntField(thiz, javaAudioRecordFields.nativeRecorderInJavaObj);
if (lpRecorder == NULL ) {
jniThrowException(env, "java/lang/IllegalStateException", NULL);
- return;
+ return AUDIORECORD_ERROR;
}
- lpRecorder->start();
+ return android_media_translateRecorderErrorCode(lpRecorder->start());
}
@@ -482,7 +482,7 @@ static jint android_media_AudioRecord_get_min_buff_size(JNIEnv *env, jobject th
// ----------------------------------------------------------------------------
static JNINativeMethod gMethods[] = {
// name, signature, funcPtr
- {"native_start", "()V", (void *)android_media_AudioRecord_start},
+ {"native_start", "()I", (void *)android_media_AudioRecord_start},
{"native_stop", "()V", (void *)android_media_AudioRecord_stop},
{"native_setup", "(Ljava/lang/Object;IIIII)I",
(void *)android_media_AudioRecord_setup},
diff --git a/libs/audioflinger/AudioFlinger.cpp b/libs/audioflinger/AudioFlinger.cpp
index 9ec8de5..f3f6e4f 100644
--- a/libs/audioflinger/AudioFlinger.cpp
+++ b/libs/audioflinger/AudioFlinger.cpp
@@ -3086,23 +3086,34 @@ bool AudioFlinger::RecordThread::threadLoop()
}
if (mActiveTrack != 0) {
if (mActiveTrack->mState == TrackBase::PAUSING) {
+ if (!mStandby) {
+ mInput->standby();
+ mStandby = true;
+ }
mActiveTrack.clear();
mStartStopCond.broadcast();
} else if (mActiveTrack->mState == TrackBase::RESUMING) {
- mRsmpInIndex = mFrameCount;
if (mReqChannelCount != mActiveTrack->channelCount()) {
mActiveTrack.clear();
- } else {
- mActiveTrack->mState = TrackBase::ACTIVE;
+ mStartStopCond.broadcast();
+ } else if (mBytesRead != 0) {
+ // record start succeeds only if first read from audio input
+ // succeeds
+ if (mBytesRead > 0) {
+ mActiveTrack->mState = TrackBase::ACTIVE;
+ } else {
+ mActiveTrack.clear();
+ }
+ mStartStopCond.broadcast();
}
- mStartStopCond.broadcast();
+ mStandby = false;
}
- mStandby = false;
}
}
if (mActiveTrack != 0) {
- if (mActiveTrack->mState != TrackBase::ACTIVE) {
+ if (mActiveTrack->mState != TrackBase::ACTIVE &&
+ mActiveTrack->mState != TrackBase::RESUMING) {
usleep(5000);
continue;
}
@@ -3140,18 +3151,19 @@ bool AudioFlinger::RecordThread::threadLoop()
}
}
if (framesOut && mFrameCount == mRsmpInIndex) {
- ssize_t bytesRead;
if (framesOut == mFrameCount &&
(mChannelCount == mReqChannelCount || mFormat != AudioSystem::PCM_16_BIT)) {
- bytesRead = mInput->read(buffer.raw, mInputBytes);
+ mBytesRead = mInput->read(buffer.raw, mInputBytes);
framesOut = 0;
} else {
- bytesRead = mInput->read(mRsmpInBuffer, mInputBytes);
+ mBytesRead = mInput->read(mRsmpInBuffer, mInputBytes);
mRsmpInIndex = 0;
}
- if (bytesRead < 0) {
+ if (mBytesRead < 0) {
LOGE("Error reading audio input");
- sleep(1);
+ if (mActiveTrack->mState == TrackBase::ACTIVE) {
+ sleep(1);
+ }
mRsmpInIndex = mFrameCount;
framesOut = 0;
buffer.frameCount = 0;
@@ -3220,7 +3232,7 @@ status_t AudioFlinger::RecordThread::start(RecordThread::RecordTrack* recordTrac
if (recordTrack != mActiveTrack.get()) {
status = -EBUSY;
} else if (mActiveTrack->mState == TrackBase::PAUSING) {
- mActiveTrack->mState = TrackBase::RESUMING;
+ mActiveTrack->mState = TrackBase::ACTIVE;
}
return status;
}
@@ -3235,6 +3247,8 @@ status_t AudioFlinger::RecordThread::start(RecordThread::RecordTrack* recordTrac
return status;
}
mActiveTrack->mState = TrackBase::RESUMING;
+ mRsmpInIndex = mFrameCount;
+ mBytesRead = 0;
// signal thread to start
LOGV("Signal record thread");
mWaitWorkCV.signal();
@@ -3275,6 +3289,7 @@ void AudioFlinger::RecordThread::stop(RecordThread::RecordTrack* recordTrack) {
mLock.unlock();
AudioSystem::stopInput(mId);
mLock.lock();
+ LOGV("Record stopped OK");
}
}
}
@@ -3325,10 +3340,12 @@ status_t AudioFlinger::RecordThread::getNextBuffer(AudioBufferProvider::Buffer*
int channelCount;
if (framesReady == 0) {
- ssize_t bytesRead = mInput->read(mRsmpInBuffer, mInputBytes);
- if (bytesRead < 0) {
+ mBytesRead = mInput->read(mRsmpInBuffer, mInputBytes);
+ if (mBytesRead < 0) {
LOGE("RecordThread::getNextBuffer() Error reading audio input");
- sleep(1);
+ if (mActiveTrack->mState == TrackBase::ACTIVE) {
+ sleep(1);
+ }
buffer->raw = 0;
buffer->frameCount = 0;
return NOT_ENOUGH_DATA;
@@ -3546,9 +3563,11 @@ int AudioFlinger::openOutput(uint32_t *pDevices,
if (pFormat) *pFormat = format;
if (pChannels) *pChannels = channels;
if (pLatencyMs) *pLatencyMs = thread->latency();
+
+ return mNextThreadId;
}
- return mNextThreadId;
+ return 0;
}
int AudioFlinger::openDuplicateOutput(int output1, int output2)
@@ -3694,9 +3713,11 @@ int AudioFlinger::openInput(uint32_t *pDevices,
if (pChannels) *pChannels = reqChannels;
input->standby();
+
+ return mNextThreadId;
}
- return mNextThreadId;
+ return 0;
}
status_t AudioFlinger::closeInput(int input)
diff --git a/libs/audioflinger/AudioFlinger.h b/libs/audioflinger/AudioFlinger.h
index 5a17294..8c29da8 100644
--- a/libs/audioflinger/AudioFlinger.h
+++ b/libs/audioflinger/AudioFlinger.h
@@ -744,6 +744,7 @@ private:
size_t mInputBytes;
int mReqChannelCount;
uint32_t mReqSampleRate;
+ ssize_t mBytesRead;
};
class RecordHandle : public android::BnAudioRecord {
diff --git a/media/java/android/media/AudioRecord.java b/media/java/android/media/AudioRecord.java
index 7a47157..c48eaad 100644
--- a/media/java/android/media/AudioRecord.java
+++ b/media/java/android/media/AudioRecord.java
@@ -498,8 +498,9 @@ public class AudioRecord
// start recording
synchronized(mRecordingStateLock) {
- native_start();
- mRecordingState = RECORDSTATE_RECORDING;
+ if (native_start() == SUCCESS) {
+ mRecordingState = RECORDSTATE_RECORDING;
+ }
}
}
@@ -764,7 +765,7 @@ public class AudioRecord
private native final void native_release();
- private native final void native_start();
+ private native final int native_start();
private native final void native_stop();
diff --git a/media/libmedia/AudioRecord.cpp b/media/libmedia/AudioRecord.cpp
index c3828f0..f4165ff 100644
--- a/media/libmedia/AudioRecord.cpp
+++ b/media/libmedia/AudioRecord.cpp
@@ -125,7 +125,7 @@ status_t AudioRecord::set(
audio_io_handle_t input = AudioSystem::getInput(inputSource,
sampleRate, format, channels, (AudioSystem::audio_in_acoustics)flags);
if (input == 0) {
- LOGE("Could not get audio output for stream type %d", inputSource);
+ LOGE("Could not get audio input for record source %d", inputSource);
return BAD_VALUE;
}
@@ -539,7 +539,6 @@ ssize_t AudioRecord::read(void* buffer, size_t userSize)
return BAD_VALUE;
}
- LOGV("read size: %d", userSize);
do {
diff --git a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/performance/MediaPlayerPerformance.java b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/performance/MediaPlayerPerformance.java
index 6e3f5e3..4cdc06d 100644
--- a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/performance/MediaPlayerPerformance.java
+++ b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/performance/MediaPlayerPerformance.java
@@ -315,16 +315,19 @@ public class MediaPlayerPerformance extends ActivityInstrumentationTestCase<Medi
mEndMemory = getMediaserverVsize();
Log.v(TAG, "End Memory " + mEndMemory);
output.write("End Memory :" + mEndMemory + "\n");
- //Write the total memory different into the output file
- output.write("The total diff = " + (mEndMemory - startMemory));
+ int memDiff = mEndMemory - startMemory;
+ if (memDiff < 0)
+ memDiff = 0;
+ else
+ output.write("The total diff = " + memDiff);
output.write("\n\n");
- //mediaserver crash
- if (startPid != mEndPid){
+ // mediaserver crash
+ if (startPid != mEndPid) {
output.write("mediaserver died. Test failed\n");
return false;
}
//memory leak greter than the tolerant
- if ((mEndMemory - startMemory) > MAX_ACCEPTED_MEMORY_LEAK_KB )
+ if (memDiff > MAX_ACCEPTED_MEMORY_LEAK_KB )
return false;
return true;
}
@@ -345,13 +348,11 @@ public class MediaPlayerPerformance extends ActivityInstrumentationTestCase<Medi
File h263MemoryOut = new File(MEDIA_MEMORY_OUTPUT);
Writer output = new BufferedWriter(new FileWriter(h263MemoryOut, true));
output.write("H263 Video Playback Only\n");
+ mStartMemory = getMediaserverVsize();
+ output.write("Start memory : " + mStartMemory + "\n");
+ Log.v(TAG, "first mem : " + mStartMemory);
for (int i = 0; i < NUM_STRESS_LOOP; i++) {
mediaStressPlayback(MediaNames.VIDEO_HIGHRES_H263);
- if (i == 0) {
- mStartMemory = getMediaserverVsize();
- output.write("Start memory : " + mStartMemory + "\n");
- Log.v(TAG, "first mem : " + mStartMemory);
- }
getMemoryWriteToLog(output);
}
output.write("\n");
@@ -369,12 +370,11 @@ public class MediaPlayerPerformance extends ActivityInstrumentationTestCase<Medi
File h264MemoryOut = new File(MEDIA_MEMORY_OUTPUT);
Writer output = new BufferedWriter(new FileWriter(h264MemoryOut, true));
output.write("H264 Video Playback only\n");
+ mStartMemory = getMediaserverVsize();
+ output.write("Start memory : " + mStartMemory + "\n");
+ Log.v(TAG, "first mem : " + mStartMemory);
for (int i = 0; i < NUM_STRESS_LOOP; i++) {
mediaStressPlayback(MediaNames.VIDEO_H264_AMR);
- if (i == 0) {
- mStartMemory = getMediaserverVsize();
- output.write("Start memory : " + mStartMemory + "\n");
- }
getMemoryWriteToLog(output);
}
output.write("\n");
@@ -392,12 +392,11 @@ public class MediaPlayerPerformance extends ActivityInstrumentationTestCase<Medi
File wmvMemoryOut = new File(MEDIA_MEMORY_OUTPUT);
Writer output = new BufferedWriter(new FileWriter(wmvMemoryOut, true));
output.write("WMV video playback only\n");
+ mStartMemory = getMediaserverVsize();
+ output.write("Start memory : " + mStartMemory + "\n");
+ Log.v(TAG, "first mem : " + mStartMemory);
for (int i = 0; i < NUM_STRESS_LOOP; i++) {
mediaStressPlayback(MediaNames.VIDEO_WMV);
- if (i == 0) {
- mStartMemory = getMediaserverVsize();
- output.write("Start memory : " + mStartMemory + "\n");
- }
getMemoryWriteToLog(output);
}
output.write("\n");
@@ -416,13 +415,13 @@ public class MediaPlayerPerformance extends ActivityInstrumentationTestCase<Medi
File videoH263RecordOnlyMemoryOut = new File(MEDIA_MEMORY_OUTPUT);
Writer output = new BufferedWriter(new FileWriter(videoH263RecordOnlyMemoryOut, true));
output.write("H263 video record only\n");
+ mStartMemory = getMediaserverVsize();
+ output.write("Start memory : " + mStartMemory + "\n");
+ Log.v(TAG, "first mem : " + mStartMemory);
+
for (int i = 0; i < NUM_STRESS_LOOP; i++) {
stressVideoRecord(20, 352, 288, MediaRecorder.VideoEncoder.H263,
MediaRecorder.OutputFormat.MPEG_4, MediaNames.RECORDED_VIDEO_3GP, true);
- if (i == 0) {
- mStartMemory = getMediaserverVsize();
- output.write("Start memory : " + mStartMemory + "\n");
- }
getMemoryWriteToLog(output);
}
output.write("\n");
@@ -440,13 +439,13 @@ public class MediaPlayerPerformance extends ActivityInstrumentationTestCase<Medi
File videoMp4RecordOnlyMemoryOut = new File(MEDIA_MEMORY_OUTPUT);
Writer output = new BufferedWriter(new FileWriter(videoMp4RecordOnlyMemoryOut, true));
output.write("MPEG4 video record only\n");
+ mStartMemory = getMediaserverVsize();
+ output.write("Start memory : " + mStartMemory + "\n");
+ Log.v(TAG, "first mem : " + mStartMemory);
+
for (int i = 0; i < NUM_STRESS_LOOP; i++) {
stressVideoRecord(20, 352, 288, MediaRecorder.VideoEncoder.MPEG_4_SP,
MediaRecorder.OutputFormat.MPEG_4, MediaNames.RECORDED_VIDEO_3GP, true);
- if (i == 0) {
- mStartMemory = getMediaserverVsize();
- output.write("Start memory : " + mStartMemory + "\n");
- }
getMemoryWriteToLog(output);
}
output.write("\n");
@@ -465,13 +464,13 @@ public class MediaPlayerPerformance extends ActivityInstrumentationTestCase<Medi
File videoRecordAudioMemoryOut = new File(MEDIA_MEMORY_OUTPUT);
Writer output = new BufferedWriter(new FileWriter(videoRecordAudioMemoryOut, true));
output.write("Audio and h263 video record\n");
+ mStartMemory = getMediaserverVsize();
+ output.write("Start memory : " + mStartMemory + "\n");
+ Log.v(TAG, "first mem : " + mStartMemory);
+
for (int i = 0; i < NUM_STRESS_LOOP; i++) {
stressVideoRecord(20, 352, 288, MediaRecorder.VideoEncoder.H263,
MediaRecorder.OutputFormat.MPEG_4, MediaNames.RECORDED_VIDEO_3GP, false);
- if (i == 0) {
- mStartMemory = getMediaserverVsize();
- output.write("Start memory : " + mStartMemory + "\n");
- }
getMemoryWriteToLog(output);
}
output.write("\n");
@@ -489,12 +488,12 @@ public class MediaPlayerPerformance extends ActivityInstrumentationTestCase<Medi
File audioOnlyMemoryOut = new File(MEDIA_MEMORY_OUTPUT);
Writer output = new BufferedWriter(new FileWriter(audioOnlyMemoryOut, true));
output.write("Audio record only\n");
+ mStartMemory = getMediaserverVsize();
+ output.write("Start memory : " + mStartMemory + "\n");
+ Log.v(TAG, "first mem : " + mStartMemory);
+
for (int i = 0; i < NUM_STRESS_LOOP; i++) {
stressAudioRecord(MediaNames.RECORDER_OUTPUT);
- if (i == 0) {
- mStartMemory = getMediaserverVsize();
- output.write("Start memory : " + mStartMemory + "\n");
- }
getMemoryWriteToLog(output);
}
output.write("\n");