DO NOT MERGE SoundPool: add lock for findSample access from SoundPoolThread am: 0a887bcd5c am: 7c798c13a7
am: 94cefd6adb
* commit '94cefd6adb7cf464e4765faaba001071b543517b':
DO NOT MERGE SoundPool: add lock for findSample access from SoundPoolThread
This commit is contained in:
@@ -187,6 +187,17 @@ bool SoundPool::startThreads()
|
|||||||
return mDecodeThread != NULL;
|
return mDecodeThread != NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sp<Sample> SoundPool::findSample(int sampleID)
|
||||||
|
{
|
||||||
|
Mutex::Autolock lock(&mLock);
|
||||||
|
return findSample_l(sampleID);
|
||||||
|
}
|
||||||
|
|
||||||
|
sp<Sample> SoundPool::findSample_l(int sampleID)
|
||||||
|
{
|
||||||
|
return mSamples.valueFor(sampleID);
|
||||||
|
}
|
||||||
|
|
||||||
SoundChannel* SoundPool::findChannel(int channelID)
|
SoundChannel* SoundPool::findChannel(int channelID)
|
||||||
{
|
{
|
||||||
for (int i = 0; i < mMaxChannels; ++i) {
|
for (int i = 0; i < mMaxChannels; ++i) {
|
||||||
@@ -211,18 +222,21 @@ int SoundPool::load(int fd, int64_t offset, int64_t length, int priority __unuse
|
|||||||
{
|
{
|
||||||
ALOGV("load: fd=%d, offset=%" PRId64 ", length=%" PRId64 ", priority=%d",
|
ALOGV("load: fd=%d, offset=%" PRId64 ", length=%" PRId64 ", priority=%d",
|
||||||
fd, offset, length, priority);
|
fd, offset, length, priority);
|
||||||
|
int sampleID;
|
||||||
|
{
|
||||||
Mutex::Autolock lock(&mLock);
|
Mutex::Autolock lock(&mLock);
|
||||||
sp<Sample> sample = new Sample(++mNextSampleID, fd, offset, length);
|
sampleID = ++mNextSampleID;
|
||||||
mSamples.add(sample->sampleID(), sample);
|
sp<Sample> sample = new Sample(sampleID, fd, offset, length);
|
||||||
doLoad(sample);
|
mSamples.add(sampleID, sample);
|
||||||
return sample->sampleID();
|
|
||||||
}
|
|
||||||
|
|
||||||
void SoundPool::doLoad(sp<Sample>& sample)
|
|
||||||
{
|
|
||||||
ALOGV("doLoad: loading sample sampleID=%d", sample->sampleID());
|
|
||||||
sample->startLoad();
|
sample->startLoad();
|
||||||
mDecodeThread->loadSample(sample->sampleID());
|
}
|
||||||
|
// mDecodeThread->loadSample() must be called outside of mLock.
|
||||||
|
// mDecodeThread->loadSample() may block on mDecodeThread message queue space;
|
||||||
|
// the message queue emptying may block on SoundPool::findSample().
|
||||||
|
//
|
||||||
|
// It theoretically possible that sample loads might decode out-of-order.
|
||||||
|
mDecodeThread->loadSample(sampleID);
|
||||||
|
return sampleID;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SoundPool::unload(int sampleID)
|
bool SoundPool::unload(int sampleID)
|
||||||
@@ -237,7 +251,6 @@ int SoundPool::play(int sampleID, float leftVolume, float rightVolume,
|
|||||||
{
|
{
|
||||||
ALOGV("play sampleID=%d, leftVolume=%f, rightVolume=%f, priority=%d, loop=%d, rate=%f",
|
ALOGV("play sampleID=%d, leftVolume=%f, rightVolume=%f, priority=%d, loop=%d, rate=%f",
|
||||||
sampleID, leftVolume, rightVolume, priority, loop, rate);
|
sampleID, leftVolume, rightVolume, priority, loop, rate);
|
||||||
sp<Sample> sample;
|
|
||||||
SoundChannel* channel;
|
SoundChannel* channel;
|
||||||
int channelID;
|
int channelID;
|
||||||
|
|
||||||
@@ -247,7 +260,7 @@ int SoundPool::play(int sampleID, float leftVolume, float rightVolume,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
// is sample ready?
|
// is sample ready?
|
||||||
sample = findSample(sampleID);
|
sp<Sample> sample(findSample_l(sampleID));
|
||||||
if ((sample == 0) || (sample->state() != Sample::READY)) {
|
if ((sample == 0) || (sample->state() != Sample::READY)) {
|
||||||
ALOGW(" sample %d not READY", sampleID);
|
ALOGW(" sample %d not READY", sampleID);
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
@@ -180,6 +180,7 @@ public:
|
|||||||
|
|
||||||
// called from SoundPoolThread
|
// called from SoundPoolThread
|
||||||
void sampleLoaded(int sampleID);
|
void sampleLoaded(int sampleID);
|
||||||
|
sp<Sample> findSample(int sampleID);
|
||||||
|
|
||||||
// called from AudioTrack thread
|
// called from AudioTrack thread
|
||||||
void done_l(SoundChannel* channel);
|
void done_l(SoundChannel* channel);
|
||||||
@@ -191,8 +192,7 @@ public:
|
|||||||
private:
|
private:
|
||||||
SoundPool() {} // no default constructor
|
SoundPool() {} // no default constructor
|
||||||
bool startThreads();
|
bool startThreads();
|
||||||
void doLoad(sp<Sample>& sample);
|
sp<Sample> findSample_l(int sampleID);
|
||||||
sp<Sample> findSample(int sampleID) { return mSamples.valueFor(sampleID); }
|
|
||||||
SoundChannel* findChannel (int channelID);
|
SoundChannel* findChannel (int channelID);
|
||||||
SoundChannel* findNextChannel (int channelID);
|
SoundChannel* findNextChannel (int channelID);
|
||||||
SoundChannel* allocateChannel_l(int priority, int sampleID);
|
SoundChannel* allocateChannel_l(int priority, int sampleID);
|
||||||
|
|||||||
Reference in New Issue
Block a user