diff options
| -rw-r--r-- | services/core/jni/com_android_server_tv_TvInputHal.cpp | 29 |
1 files changed, 28 insertions, 1 deletions
diff --git a/services/core/jni/com_android_server_tv_TvInputHal.cpp b/services/core/jni/com_android_server_tv_TvInputHal.cpp index da4193c..dcb5199 100644 --- a/services/core/jni/com_android_server_tv_TvInputHal.cpp +++ b/services/core/jni/com_android_server_tv_TvInputHal.cpp @@ -264,6 +264,7 @@ private: class NotifyHandler : public MessageHandler { public: NotifyHandler(JTvInputHal* hal, const tv_input_event_t* event); + ~NotifyHandler(); virtual void handleMessage(const Message& message); @@ -277,6 +278,9 @@ private: static void notify( tv_input_device_t* dev, tv_input_event_t* event, void* data); + static void cloneTvInputEvent( + tv_input_event_t* dstEvent, const tv_input_event_t* srcEvent); + Mutex mLock; jweak mThiz; tv_input_device_t* mDevice; @@ -447,6 +451,20 @@ void JTvInputHal::notify( thiz->mLooper->sendMessage(new NotifyHandler(thiz, event), event->type); } +// static +void JTvInputHal::cloneTvInputEvent( + tv_input_event_t* dstEvent, const tv_input_event_t* srcEvent) { + memcpy(dstEvent, srcEvent, sizeof(tv_input_event_t)); + if ((srcEvent->type == TV_INPUT_EVENT_DEVICE_AVAILABLE || + srcEvent->type == TV_INPUT_EVENT_DEVICE_UNAVAILABLE || + srcEvent->type == TV_INPUT_EVENT_STREAM_CONFIGURATIONS_CHANGED) && + srcEvent->device_info.audio_address != NULL){ + char* audio_address = new char[strlen(srcEvent->device_info.audio_address) + 1]; + strcpy(audio_address, srcEvent->device_info.audio_address); + dstEvent->device_info.audio_address = audio_address; + } +} + void JTvInputHal::onDeviceAvailable(const tv_input_device_info_t& info) { { Mutex::Autolock autoLock(&mLock); @@ -543,7 +561,16 @@ void JTvInputHal::onCaptured(int deviceId, int streamId, uint32_t seq, bool succ JTvInputHal::NotifyHandler::NotifyHandler(JTvInputHal* hal, const tv_input_event_t* event) { mHal = hal; - memcpy(&mEvent, event, sizeof(mEvent)); + cloneTvInputEvent(&mEvent, event); +} + +JTvInputHal::NotifyHandler::~NotifyHandler() { + if ((mEvent.type == TV_INPUT_EVENT_DEVICE_AVAILABLE || + mEvent.type == TV_INPUT_EVENT_DEVICE_UNAVAILABLE || + mEvent.type == TV_INPUT_EVENT_STREAM_CONFIGURATIONS_CHANGED) && + mEvent.device_info.audio_address != NULL) { + delete mEvent.device_info.audio_address; + } } void JTvInputHal::NotifyHandler::handleMessage(const Message& message) { |
