From bc11e713063f3f96f98256abc81c0d8ee1ddb312 Mon Sep 17 00:00:00 2001 From: Marco Nelissen Date: Thu, 8 Jan 2015 12:26:36 -0800 Subject: Use callbacks for Midi I/O Instead of having the Sonivox engine directly open the file and use stdio to read from it, use caller-provided callbacks. Change-Id: Ie55129109060a4a7862fee3177f994401e00b6c1 --- media/libmedia/MidiIoWrapper.cpp | 76 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 media/libmedia/MidiIoWrapper.cpp (limited to 'media/libmedia/MidiIoWrapper.cpp') diff --git a/media/libmedia/MidiIoWrapper.cpp b/media/libmedia/MidiIoWrapper.cpp new file mode 100644 index 0000000..ef931d2 --- /dev/null +++ b/media/libmedia/MidiIoWrapper.cpp @@ -0,0 +1,76 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +//#define LOG_NDEBUG 0 +#define LOG_TAG "MidiIoWrapper" +#include +#include + +#include +#include + +#include "media/MidiIoWrapper.h" + +static int readAt(void *handle, void *buffer, int pos, int size) { + return ((android::MidiIoWrapper*)handle)->readAt(buffer, pos, size); +} +static int size(void *handle) { + return ((android::MidiIoWrapper*)handle)->size(); +} + +namespace android { + +MidiIoWrapper::MidiIoWrapper(const char *path) { + ALOGV("MidiIoWrapper(%s)", path); + mFd = open(path, O_RDONLY | O_LARGEFILE); + mBase = 0; + mLength = lseek(mFd, 0, SEEK_END); +} + +MidiIoWrapper::MidiIoWrapper(int fd, off64_t offset, int64_t size) { + ALOGV("MidiIoWrapper(fd=%d)", fd); + mFd = dup(fd); + mBase = offset; + mLength = size; +} + +MidiIoWrapper::~MidiIoWrapper() { + ALOGV("~MidiIoWrapper"); + close(mFd); +} + +int MidiIoWrapper::readAt(void *buffer, int offset, int size) { + ALOGV("readAt(%p, %d, %d)", buffer, offset, size); + lseek(mFd, mBase + offset, SEEK_SET); + if (offset + size > mLength) { + size = mLength - offset; + } + return read(mFd, buffer, size); +} + +int MidiIoWrapper::size() { + ALOGV("size() = %d", mLength); + return mLength; +} + +EAS_FILE_LOCATOR MidiIoWrapper::getLocator() { + mEasFile.handle = this; + mEasFile.readAt = ::readAt; + mEasFile.size = ::size; + return &mEasFile; +} + +} // namespace android -- cgit v1.1