Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 91e2d865 authored by Android (Google) Code Review's avatar Android (Google) Code Review
Browse files

Merge change 24337 into eclair

* changes:
  Fix issue 2107584: media server crash when AudioFlinger fails to allocate memory for track control block.
parents ab50b86b 8a77a995
Loading
Loading
Loading
Loading
+27 −22
Original line number Diff line number Diff line
@@ -2014,6 +2014,7 @@ AudioFlinger::ThreadBase::TrackBase::TrackBase(
    :   RefBase(),
        mThread(thread),
        mClient(client),
        mCblk(0),
        mFrameCount(0),
        mState(IDLE),
        mClientTid(-1),
@@ -2162,6 +2163,7 @@ AudioFlinger::PlaybackThread::Track::Track(
    :   TrackBase(thread, client, sampleRate, format, channelCount, frameCount, 0, sharedBuffer),
    mMute(false), mSharedBuffer(sharedBuffer), mName(-1)
{
    if (mCblk != NULL) {
        sp<ThreadBase> baseThread = thread.promote();
        if (baseThread != 0) {
            PlaybackThread *playbackThread = (PlaybackThread *)baseThread.get();
@@ -2178,6 +2180,7 @@ AudioFlinger::PlaybackThread::Track::Track(
        // 16 bit because data is converted to 16 bit before being stored in buffer by AudioTrack
        mCblk->frameSize = AudioSystem::isLinearPCM(format) ? channelCount * sizeof(int16_t) : sizeof(int8_t);
    }
}

AudioFlinger::PlaybackThread::Track::~Track()
{
@@ -2390,6 +2393,7 @@ AudioFlinger::RecordThread::RecordTrack::RecordTrack(
                  channelCount, frameCount, flags, 0),
        mOverflow(false)
{
    if (mCblk != NULL) {
       LOGV("RecordTrack constructor, size %d", (int)mBufferEnd - (int)mBuffer);
       if (format == AudioSystem::PCM_16_BIT) {
           mCblk->frameSize = channelCount * sizeof(int16_t);
@@ -2399,6 +2403,7 @@ AudioFlinger::RecordThread::RecordTrack::RecordTrack(
           mCblk->frameSize = sizeof(int8_t);
       }
    }
}

AudioFlinger::RecordThread::RecordTrack::~RecordTrack()
{
+14 −5
Original line number Diff line number Diff line
@@ -83,6 +83,7 @@ public:
                                status_t *status)
    {
        Parcel data, reply;
        sp<IAudioTrack> track;
        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
        data.writeInt32(pid);
        data.writeInt32(streamType);
@@ -96,12 +97,14 @@ public:
        status_t lStatus = remote()->transact(CREATE_TRACK, data, &reply);
        if (lStatus != NO_ERROR) {
            LOGE("createTrack error: %s", strerror(-lStatus));
        }
        } else {
            lStatus = reply.readInt32();
            track = interface_cast<IAudioTrack>(reply.readStrongBinder());
        }
        if (status) {
            *status = lStatus;
        }
        return interface_cast<IAudioTrack>(reply.readStrongBinder());
        return track;
    }

    virtual sp<IAudioRecord> openRecord(
@@ -115,6 +118,7 @@ public:
                                status_t *status)
    {
        Parcel data, reply;
        sp<IAudioRecord> record;
        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
        data.writeInt32(pid);
        data.writeInt32(input);
@@ -123,12 +127,17 @@ public:
        data.writeInt32(channelCount);
        data.writeInt32(frameCount);
        data.writeInt32(flags);
        remote()->transact(OPEN_RECORD, data, &reply);
        status_t lStatus = reply.readInt32();
        status_t lStatus = remote()->transact(OPEN_RECORD, data, &reply);
        if (lStatus != NO_ERROR) {
            LOGE("openRecord error: %s", strerror(-lStatus));
        } else {
            lStatus = reply.readInt32();
            record = interface_cast<IAudioRecord>(reply.readStrongBinder());
        }
        if (status) {
            *status = lStatus;
        }
        return interface_cast<IAudioRecord>(reply.readStrongBinder());
        return record;
    }

    virtual uint32_t sampleRate(int output) const
+6 −2
Original line number Diff line number Diff line
@@ -56,9 +56,13 @@ public:
    virtual sp<IMemory> getCblk() const
    {
        Parcel data, reply;
        sp<IMemory> cblk;
        data.writeInterfaceToken(IAudioRecord::getInterfaceDescriptor());
        remote()->transact(GET_CBLK, data, &reply);
        return interface_cast<IMemory>(reply.readStrongBinder());
        status_t status = remote()->transact(GET_CBLK, data, &reply);
        if (status == NO_ERROR) {
            cblk = interface_cast<IMemory>(reply.readStrongBinder());
        }
        return cblk;
    }    
};

+6 −2
Original line number Diff line number Diff line
@@ -81,9 +81,13 @@ public:
    virtual sp<IMemory> getCblk() const
    {
        Parcel data, reply;
        sp<IMemory> cblk;
        data.writeInterfaceToken(IAudioTrack::getInterfaceDescriptor());
        remote()->transact(GET_CBLK, data, &reply);
        return interface_cast<IMemory>(reply.readStrongBinder());
        status_t status = remote()->transact(GET_CBLK, data, &reply);
        if (status == NO_ERROR) {
            cblk = interface_cast<IMemory>(reply.readStrongBinder());
        }
        return cblk;
    }    
};