diff options
author | Android (Google) Code Review <android-gerrit@google.com> | 2009-09-14 02:43:52 -0400 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2009-09-14 02:43:52 -0400 |
commit | a72e166d734648f7fb27bf4e820e045b0da9f7a5 (patch) | |
tree | a19a7046fe6643053af80c562c8fe1e5c6b157a2 | |
parent | 8f0e4aace6c0643f7c4005184c7df2c73368f0dc (diff) | |
parent | 5841db78dff14898538200287d246577b1fc37e2 (diff) | |
download | frameworks_av-a72e166d734648f7fb27bf4e820e045b0da9f7a5.zip frameworks_av-a72e166d734648f7fb27bf4e820e045b0da9f7a5.tar.gz frameworks_av-a72e166d734648f7fb27bf4e820e045b0da9f7a5.tar.bz2 |
Merge change 24337 into eclair
* changes:
Fix issue 2107584: media server crash when AudioFlinger fails to allocate memory for track control block.
-rw-r--r-- | media/libmedia/IAudioFlinger.cpp | 19 | ||||
-rw-r--r-- | media/libmedia/IAudioRecord.cpp | 8 | ||||
-rw-r--r-- | media/libmedia/IAudioTrack.cpp | 8 |
3 files changed, 26 insertions, 9 deletions
diff --git a/media/libmedia/IAudioFlinger.cpp b/media/libmedia/IAudioFlinger.cpp index fc39a46..5089157 100644 --- a/media/libmedia/IAudioFlinger.cpp +++ b/media/libmedia/IAudioFlinger.cpp @@ -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()); } - lStatus = reply.readInt32(); 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 diff --git a/media/libmedia/IAudioRecord.cpp b/media/libmedia/IAudioRecord.cpp index 8fb5d3d..dacf75a 100644 --- a/media/libmedia/IAudioRecord.cpp +++ b/media/libmedia/IAudioRecord.cpp @@ -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; } }; diff --git a/media/libmedia/IAudioTrack.cpp b/media/libmedia/IAudioTrack.cpp index 75b861b..7f43347 100644 --- a/media/libmedia/IAudioTrack.cpp +++ b/media/libmedia/IAudioTrack.cpp @@ -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; } }; |