Merge change Ifb9d6df3 into eclair
* changes: More log for issue 2242381.
This commit is contained in:
@ -815,6 +815,58 @@ void AudioFlinger::ThreadBase::processConfigEvents()
|
|||||||
mLock.unlock();
|
mLock.unlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
status_t AudioFlinger::ThreadBase::dumpBase(int fd, const Vector<String16>& args)
|
||||||
|
{
|
||||||
|
const size_t SIZE = 256;
|
||||||
|
char buffer[SIZE];
|
||||||
|
String8 result;
|
||||||
|
|
||||||
|
bool locked = tryLock(mLock);
|
||||||
|
if (!locked) {
|
||||||
|
snprintf(buffer, SIZE, "thread %p maybe dead locked\n", this);
|
||||||
|
write(fd, buffer, strlen(buffer));
|
||||||
|
}
|
||||||
|
|
||||||
|
snprintf(buffer, SIZE, "standby: %d\n", mStandby);
|
||||||
|
result.append(buffer);
|
||||||
|
snprintf(buffer, SIZE, "Sample rate: %d\n", mSampleRate);
|
||||||
|
result.append(buffer);
|
||||||
|
snprintf(buffer, SIZE, "Frame count: %d\n", mFrameCount);
|
||||||
|
result.append(buffer);
|
||||||
|
snprintf(buffer, SIZE, "Channel Count: %d\n", mChannelCount);
|
||||||
|
result.append(buffer);
|
||||||
|
snprintf(buffer, SIZE, "Format: %d\n", mFormat);
|
||||||
|
result.append(buffer);
|
||||||
|
snprintf(buffer, SIZE, "Frame size: %d\n", mFrameSize);
|
||||||
|
result.append(buffer);
|
||||||
|
|
||||||
|
snprintf(buffer, SIZE, "\nPending setParameters commands: \n");
|
||||||
|
result.append(buffer);
|
||||||
|
result.append(" Index Command");
|
||||||
|
for (size_t i = 0; i < mNewParameters.size(); ++i) {
|
||||||
|
snprintf(buffer, SIZE, "\n %02d ", i);
|
||||||
|
result.append(buffer);
|
||||||
|
result.append(mNewParameters[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
snprintf(buffer, SIZE, "\n\nPending config events: \n");
|
||||||
|
result.append(buffer);
|
||||||
|
snprintf(buffer, SIZE, " Index event param\n");
|
||||||
|
result.append(buffer);
|
||||||
|
for (size_t i = 0; i < mConfigEvents.size(); i++) {
|
||||||
|
snprintf(buffer, SIZE, " %02d %02d %d\n", i, mConfigEvents[i]->mEvent, mConfigEvents[i]->mParam);
|
||||||
|
result.append(buffer);
|
||||||
|
}
|
||||||
|
result.append("\n");
|
||||||
|
|
||||||
|
write(fd, result.string(), result.size());
|
||||||
|
|
||||||
|
if (locked) {
|
||||||
|
mLock.unlock();
|
||||||
|
}
|
||||||
|
return NO_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
@ -888,7 +940,7 @@ status_t AudioFlinger::PlaybackThread::dumpInternals(int fd, const Vector<String
|
|||||||
char buffer[SIZE];
|
char buffer[SIZE];
|
||||||
String8 result;
|
String8 result;
|
||||||
|
|
||||||
snprintf(buffer, SIZE, "Output thread %p internals\n", this);
|
snprintf(buffer, SIZE, "\nOutput thread %p internals\n", this);
|
||||||
result.append(buffer);
|
result.append(buffer);
|
||||||
snprintf(buffer, SIZE, "last write occurred (msecs): %llu\n", ns2ms(systemTime() - mLastWriteTime));
|
snprintf(buffer, SIZE, "last write occurred (msecs): %llu\n", ns2ms(systemTime() - mLastWriteTime));
|
||||||
result.append(buffer);
|
result.append(buffer);
|
||||||
@ -898,9 +950,10 @@ status_t AudioFlinger::PlaybackThread::dumpInternals(int fd, const Vector<String
|
|||||||
result.append(buffer);
|
result.append(buffer);
|
||||||
snprintf(buffer, SIZE, "blocked in write: %d\n", mInWrite);
|
snprintf(buffer, SIZE, "blocked in write: %d\n", mInWrite);
|
||||||
result.append(buffer);
|
result.append(buffer);
|
||||||
snprintf(buffer, SIZE, "standby: %d\n", mStandby);
|
|
||||||
result.append(buffer);
|
|
||||||
write(fd, result.string(), result.size());
|
write(fd, result.string(), result.size());
|
||||||
|
|
||||||
|
dumpBase(fd, args);
|
||||||
|
|
||||||
return NO_ERROR;
|
return NO_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1493,8 +1546,6 @@ bool AudioFlinger::MixerThread::checkForNewParameters_l()
|
|||||||
AudioParameter param = AudioParameter(keyValuePair);
|
AudioParameter param = AudioParameter(keyValuePair);
|
||||||
int value;
|
int value;
|
||||||
|
|
||||||
mNewParameters.removeAt(0);
|
|
||||||
|
|
||||||
if (param.getInt(String8(AudioParameter::keySamplingRate), value) == NO_ERROR) {
|
if (param.getInt(String8(AudioParameter::keySamplingRate), value) == NO_ERROR) {
|
||||||
reconfig = true;
|
reconfig = true;
|
||||||
}
|
}
|
||||||
@ -1546,6 +1597,9 @@ bool AudioFlinger::MixerThread::checkForNewParameters_l()
|
|||||||
sendConfigEvent_l(AudioSystem::OUTPUT_CONFIG_CHANGED);
|
sendConfigEvent_l(AudioSystem::OUTPUT_CONFIG_CHANGED);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mNewParameters.removeAt(0);
|
||||||
|
|
||||||
mParamStatus = status;
|
mParamStatus = status;
|
||||||
mParamCond.signal();
|
mParamCond.signal();
|
||||||
mWaitWorkCV.wait(mLock);
|
mWaitWorkCV.wait(mLock);
|
||||||
@ -1818,8 +1872,6 @@ bool AudioFlinger::DirectOutputThread::checkForNewParameters_l()
|
|||||||
AudioParameter param = AudioParameter(keyValuePair);
|
AudioParameter param = AudioParameter(keyValuePair);
|
||||||
int value;
|
int value;
|
||||||
|
|
||||||
mNewParameters.removeAt(0);
|
|
||||||
|
|
||||||
if (param.getInt(String8(AudioParameter::keyFrameCount), value) == NO_ERROR) {
|
if (param.getInt(String8(AudioParameter::keyFrameCount), value) == NO_ERROR) {
|
||||||
// do not accept frame count changes if tracks are open as the track buffer
|
// do not accept frame count changes if tracks are open as the track buffer
|
||||||
// size depends on frame count and correct behavior would not be garantied
|
// size depends on frame count and correct behavior would not be garantied
|
||||||
@ -1843,6 +1895,9 @@ bool AudioFlinger::DirectOutputThread::checkForNewParameters_l()
|
|||||||
sendConfigEvent_l(AudioSystem::OUTPUT_CONFIG_CHANGED);
|
sendConfigEvent_l(AudioSystem::OUTPUT_CONFIG_CHANGED);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mNewParameters.removeAt(0);
|
||||||
|
|
||||||
mParamStatus = status;
|
mParamStatus = status;
|
||||||
mParamCond.signal();
|
mParamCond.signal();
|
||||||
mWaitWorkCV.wait(mLock);
|
mWaitWorkCV.wait(mLock);
|
||||||
@ -2253,7 +2308,7 @@ void AudioFlinger::PlaybackThread::Track::destroy()
|
|||||||
|
|
||||||
void AudioFlinger::PlaybackThread::Track::dump(char* buffer, size_t size)
|
void AudioFlinger::PlaybackThread::Track::dump(char* buffer, size_t size)
|
||||||
{
|
{
|
||||||
snprintf(buffer, size, " %5d %5d %3u %3u %3u %3u %1d %1d %1d %5u %5u %5u %04x %04x\n",
|
snprintf(buffer, size, " %5d %5d %3u %3u %3u %04u %1d %1d %1d %5u %5u %5u %08x %08x\n",
|
||||||
mName - AudioMixer::TRACK0,
|
mName - AudioMixer::TRACK0,
|
||||||
(mClient == NULL) ? getpid() : mClient->pid(),
|
(mClient == NULL) ? getpid() : mClient->pid(),
|
||||||
mStreamType,
|
mStreamType,
|
||||||
@ -2509,6 +2564,19 @@ void AudioFlinger::RecordThread::RecordTrack::stop()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void AudioFlinger::RecordThread::RecordTrack::dump(char* buffer, size_t size)
|
||||||
|
{
|
||||||
|
snprintf(buffer, size, " %05d %03u %03u %04u %01d %05u %08x %08x\n",
|
||||||
|
(mClient == NULL) ? getpid() : mClient->pid(),
|
||||||
|
mFormat,
|
||||||
|
mCblk->channels,
|
||||||
|
mFrameCount,
|
||||||
|
mState,
|
||||||
|
mCblk->sampleRate,
|
||||||
|
mCblk->server,
|
||||||
|
mCblk->user);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
@ -3136,13 +3204,34 @@ status_t AudioFlinger::RecordThread::dump(int fd, const Vector<String16>& args)
|
|||||||
String8 result;
|
String8 result;
|
||||||
pid_t pid = 0;
|
pid_t pid = 0;
|
||||||
|
|
||||||
if (mActiveTrack != 0 && mActiveTrack->mClient != 0) {
|
snprintf(buffer, SIZE, "\nInput thread %p internals\n", this);
|
||||||
snprintf(buffer, SIZE, "Record client pid: %d\n", mActiveTrack->mClient->pid());
|
|
||||||
result.append(buffer);
|
result.append(buffer);
|
||||||
|
|
||||||
|
if (mActiveTrack != 0) {
|
||||||
|
result.append("Active Track:\n");
|
||||||
|
result.append(" Clien Fmt Chn Buf S SRate Serv User\n");
|
||||||
|
mActiveTrack->dump(buffer, SIZE);
|
||||||
|
result.append(buffer);
|
||||||
|
|
||||||
|
snprintf(buffer, SIZE, "In index: %d\n", mRsmpInIndex);
|
||||||
|
result.append(buffer);
|
||||||
|
snprintf(buffer, SIZE, "In size: %d\n", mInputBytes);
|
||||||
|
result.append(buffer);
|
||||||
|
snprintf(buffer, SIZE, "Resampling: %d\n", (mResampler != 0));
|
||||||
|
result.append(buffer);
|
||||||
|
snprintf(buffer, SIZE, "Out channel count: %d\n", mReqChannelCount);
|
||||||
|
result.append(buffer);
|
||||||
|
snprintf(buffer, SIZE, "Out sample rate: %d\n", mReqSampleRate);
|
||||||
|
result.append(buffer);
|
||||||
|
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
result.append("No record client\n");
|
result.append("No record client\n");
|
||||||
}
|
}
|
||||||
write(fd, result.string(), result.size());
|
write(fd, result.string(), result.size());
|
||||||
|
|
||||||
|
dumpBase(fd, args);
|
||||||
|
|
||||||
return NO_ERROR;
|
return NO_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3198,8 +3287,6 @@ bool AudioFlinger::RecordThread::checkForNewParameters_l()
|
|||||||
int reqSamplingRate = mReqSampleRate;
|
int reqSamplingRate = mReqSampleRate;
|
||||||
int reqChannelCount = mReqChannelCount;
|
int reqChannelCount = mReqChannelCount;
|
||||||
|
|
||||||
mNewParameters.removeAt(0);
|
|
||||||
|
|
||||||
if (param.getInt(String8(AudioParameter::keySamplingRate), value) == NO_ERROR) {
|
if (param.getInt(String8(AudioParameter::keySamplingRate), value) == NO_ERROR) {
|
||||||
reqSamplingRate = value;
|
reqSamplingRate = value;
|
||||||
reconfig = true;
|
reconfig = true;
|
||||||
@ -3241,6 +3328,9 @@ bool AudioFlinger::RecordThread::checkForNewParameters_l()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mNewParameters.removeAt(0);
|
||||||
|
|
||||||
mParamStatus = status;
|
mParamStatus = status;
|
||||||
mParamCond.signal();
|
mParamCond.signal();
|
||||||
mWaitWorkCV.wait(mLock);
|
mWaitWorkCV.wait(mLock);
|
||||||
|
@ -216,6 +216,8 @@ private:
|
|||||||
ThreadBase (const sp<AudioFlinger>& audioFlinger);
|
ThreadBase (const sp<AudioFlinger>& audioFlinger);
|
||||||
virtual ~ThreadBase();
|
virtual ~ThreadBase();
|
||||||
|
|
||||||
|
status_t dumpBase(int fd, const Vector<String16>& args);
|
||||||
|
|
||||||
// base for record and playback
|
// base for record and playback
|
||||||
class TrackBase : public AudioBufferProvider, public RefBase {
|
class TrackBase : public AudioBufferProvider, public RefBase {
|
||||||
|
|
||||||
@ -678,6 +680,7 @@ private:
|
|||||||
bool overflow() { bool tmp = mOverflow; mOverflow = false; return tmp; }
|
bool overflow() { bool tmp = mOverflow; mOverflow = false; return tmp; }
|
||||||
bool setOverflow() { bool tmp = mOverflow; mOverflow = true; return tmp; }
|
bool setOverflow() { bool tmp = mOverflow; mOverflow = true; return tmp; }
|
||||||
|
|
||||||
|
void dump(char* buffer, size_t size);
|
||||||
private:
|
private:
|
||||||
friend class AudioFlinger;
|
friend class AudioFlinger;
|
||||||
friend class RecordThread;
|
friend class RecordThread;
|
||||||
|
@ -592,6 +592,8 @@ bool AudioPolicyService::AudioCommandThread::threadLoop()
|
|||||||
if (mAudioCommands[0]->mTime <= curTime) {
|
if (mAudioCommands[0]->mTime <= curTime) {
|
||||||
AudioCommand *command = mAudioCommands[0];
|
AudioCommand *command = mAudioCommands[0];
|
||||||
mAudioCommands.removeAt(0);
|
mAudioCommands.removeAt(0);
|
||||||
|
mLastCommand = *command;
|
||||||
|
|
||||||
switch (command->mCommand) {
|
switch (command->mCommand) {
|
||||||
case START_TONE: {
|
case START_TONE: {
|
||||||
mLock.unlock();
|
mLock.unlock();
|
||||||
@ -681,11 +683,15 @@ status_t AudioPolicyService::AudioCommandThread::dump(int fd)
|
|||||||
|
|
||||||
snprintf(buffer, SIZE, "- Commands:\n");
|
snprintf(buffer, SIZE, "- Commands:\n");
|
||||||
result = String8(buffer);
|
result = String8(buffer);
|
||||||
result.append(" Command Time Status Wait pParam\n");
|
result.append(" Command Time Wait pParam\n");
|
||||||
for (int i = 0; i < (int)mAudioCommands.size(); i++) {
|
for (int i = 0; i < (int)mAudioCommands.size(); i++) {
|
||||||
mAudioCommands[i]->dump(buffer, SIZE);
|
mAudioCommands[i]->dump(buffer, SIZE);
|
||||||
result.append(buffer);
|
result.append(buffer);
|
||||||
}
|
}
|
||||||
|
result.append(" Last Command\n");
|
||||||
|
mLastCommand.dump(buffer, SIZE);
|
||||||
|
result.append(buffer);
|
||||||
|
|
||||||
write(fd, result.string(), result.size());
|
write(fd, result.string(), result.size());
|
||||||
|
|
||||||
if (locked) mLock.unlock();
|
if (locked) mLock.unlock();
|
||||||
@ -894,11 +900,10 @@ void AudioPolicyService::AudioCommandThread::exit()
|
|||||||
|
|
||||||
void AudioPolicyService::AudioCommandThread::AudioCommand::dump(char* buffer, size_t size)
|
void AudioPolicyService::AudioCommandThread::AudioCommand::dump(char* buffer, size_t size)
|
||||||
{
|
{
|
||||||
snprintf(buffer, size, " %02d %06d.%03d %03d %01u %p\n",
|
snprintf(buffer, size, " %02d %06d.%03d %01u %p\n",
|
||||||
mCommand,
|
mCommand,
|
||||||
(int)ns2s(mTime),
|
(int)ns2s(mTime),
|
||||||
(int)ns2ms(mTime)%1000,
|
(int)ns2ms(mTime)%1000,
|
||||||
mStatus,
|
|
||||||
mWaitStatus,
|
mWaitStatus,
|
||||||
mParam);
|
mParam);
|
||||||
}
|
}
|
||||||
|
@ -152,7 +152,11 @@ private:
|
|||||||
private:
|
private:
|
||||||
// descriptor for requested tone playback event
|
// descriptor for requested tone playback event
|
||||||
class AudioCommand {
|
class AudioCommand {
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
AudioCommand()
|
||||||
|
: mCommand(-1) {}
|
||||||
|
|
||||||
void dump(char* buffer, size_t size);
|
void dump(char* buffer, size_t size);
|
||||||
|
|
||||||
int mCommand; // START_TONE, STOP_TONE ...
|
int mCommand; // START_TONE, STOP_TONE ...
|
||||||
@ -191,6 +195,7 @@ private:
|
|||||||
Condition mWaitWorkCV;
|
Condition mWaitWorkCV;
|
||||||
Vector <AudioCommand *> mAudioCommands; // list of pending commands
|
Vector <AudioCommand *> mAudioCommands; // list of pending commands
|
||||||
ToneGenerator *mpToneGenerator; // the tone generator
|
ToneGenerator *mpToneGenerator; // the tone generator
|
||||||
|
AudioCommand mLastCommand;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Internal dump utilities.
|
// Internal dump utilities.
|
||||||
|
Reference in New Issue
Block a user