1faf4efc6a41e88adf85f76f48f020a6d681f5ff1Marco Nelissen/* 2faf4efc6a41e88adf85f76f48f020a6d681f5ff1Marco Nelissen * Copyright (C) 2014 The Android Open Source Project 3faf4efc6a41e88adf85f76f48f020a6d681f5ff1Marco Nelissen * 4faf4efc6a41e88adf85f76f48f020a6d681f5ff1Marco Nelissen * Licensed under the Apache License, Version 2.0 (the "License"); 5faf4efc6a41e88adf85f76f48f020a6d681f5ff1Marco Nelissen * you may not use this file except in compliance with the License. 6faf4efc6a41e88adf85f76f48f020a6d681f5ff1Marco Nelissen * You may obtain a copy of the License at 7faf4efc6a41e88adf85f76f48f020a6d681f5ff1Marco Nelissen * 8faf4efc6a41e88adf85f76f48f020a6d681f5ff1Marco Nelissen * http://www.apache.org/licenses/LICENSE-2.0 9faf4efc6a41e88adf85f76f48f020a6d681f5ff1Marco Nelissen * 10faf4efc6a41e88adf85f76f48f020a6d681f5ff1Marco Nelissen * Unless required by applicable law or agreed to in writing, software 11faf4efc6a41e88adf85f76f48f020a6d681f5ff1Marco Nelissen * distributed under the License is distributed on an "AS IS" BASIS, 12faf4efc6a41e88adf85f76f48f020a6d681f5ff1Marco Nelissen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13faf4efc6a41e88adf85f76f48f020a6d681f5ff1Marco Nelissen * See the License for the specific language governing permissions and 14faf4efc6a41e88adf85f76f48f020a6d681f5ff1Marco Nelissen * limitations under the License. 15faf4efc6a41e88adf85f76f48f020a6d681f5ff1Marco Nelissen */ 16faf4efc6a41e88adf85f76f48f020a6d681f5ff1Marco Nelissen 17faf4efc6a41e88adf85f76f48f020a6d681f5ff1Marco Nelissen#ifndef MIDI_EXTRACTOR_H_ 18faf4efc6a41e88adf85f76f48f020a6d681f5ff1Marco Nelissen#define MIDI_EXTRACTOR_H_ 19faf4efc6a41e88adf85f76f48f020a6d681f5ff1Marco Nelissen 20faf4efc6a41e88adf85f76f48f020a6d681f5ff1Marco Nelissen#include <media/stagefright/DataSource.h> 21faf4efc6a41e88adf85f76f48f020a6d681f5ff1Marco Nelissen#include <media/stagefright/MediaExtractor.h> 22faf4efc6a41e88adf85f76f48f020a6d681f5ff1Marco Nelissen#include <media/stagefright/MediaBuffer.h> 23faf4efc6a41e88adf85f76f48f020a6d681f5ff1Marco Nelissen#include <media/stagefright/MediaBufferGroup.h> 24faf4efc6a41e88adf85f76f48f020a6d681f5ff1Marco Nelissen#include <media/MidiIoWrapper.h> 25faf4efc6a41e88adf85f76f48f020a6d681f5ff1Marco Nelissen#include <utils/String8.h> 26faf4efc6a41e88adf85f76f48f020a6d681f5ff1Marco Nelissen#include <libsonivox/eas.h> 27faf4efc6a41e88adf85f76f48f020a6d681f5ff1Marco Nelissen 28faf4efc6a41e88adf85f76f48f020a6d681f5ff1Marco Nelissennamespace android { 29faf4efc6a41e88adf85f76f48f020a6d681f5ff1Marco Nelissen 30faf4efc6a41e88adf85f76f48f020a6d681f5ff1Marco Nelissenclass MidiEngine : public RefBase { 31faf4efc6a41e88adf85f76f48f020a6d681f5ff1Marco Nelissenpublic: 32faf4efc6a41e88adf85f76f48f020a6d681f5ff1Marco Nelissen MidiEngine(const sp<DataSource> &dataSource, 33faf4efc6a41e88adf85f76f48f020a6d681f5ff1Marco Nelissen const sp<MetaData> &fileMetadata, 34faf4efc6a41e88adf85f76f48f020a6d681f5ff1Marco Nelissen const sp<MetaData> &trackMetadata); 35faf4efc6a41e88adf85f76f48f020a6d681f5ff1Marco Nelissen ~MidiEngine(); 36faf4efc6a41e88adf85f76f48f020a6d681f5ff1Marco Nelissen 37faf4efc6a41e88adf85f76f48f020a6d681f5ff1Marco Nelissen status_t initCheck(); 38faf4efc6a41e88adf85f76f48f020a6d681f5ff1Marco Nelissen 39faf4efc6a41e88adf85f76f48f020a6d681f5ff1Marco Nelissen status_t allocateBuffers(); 40faf4efc6a41e88adf85f76f48f020a6d681f5ff1Marco Nelissen status_t releaseBuffers(); 41faf4efc6a41e88adf85f76f48f020a6d681f5ff1Marco Nelissen status_t seekTo(int64_t positionUs); 42faf4efc6a41e88adf85f76f48f020a6d681f5ff1Marco Nelissen MediaBuffer* readBuffer(); 43faf4efc6a41e88adf85f76f48f020a6d681f5ff1Marco Nelissenprivate: 44faf4efc6a41e88adf85f76f48f020a6d681f5ff1Marco Nelissen sp<MidiIoWrapper> mIoWrapper; 45faf4efc6a41e88adf85f76f48f020a6d681f5ff1Marco Nelissen MediaBufferGroup *mGroup; 46faf4efc6a41e88adf85f76f48f020a6d681f5ff1Marco Nelissen EAS_DATA_HANDLE mEasData; 47faf4efc6a41e88adf85f76f48f020a6d681f5ff1Marco Nelissen EAS_HANDLE mEasHandle; 48faf4efc6a41e88adf85f76f48f020a6d681f5ff1Marco Nelissen const S_EAS_LIB_CONFIG* mEasConfig; 49faf4efc6a41e88adf85f76f48f020a6d681f5ff1Marco Nelissen bool mIsInitialized; 50faf4efc6a41e88adf85f76f48f020a6d681f5ff1Marco Nelissen}; 51faf4efc6a41e88adf85f76f48f020a6d681f5ff1Marco Nelissen 52faf4efc6a41e88adf85f76f48f020a6d681f5ff1Marco Nelissenclass MidiExtractor : public MediaExtractor { 53faf4efc6a41e88adf85f76f48f020a6d681f5ff1Marco Nelissen 54faf4efc6a41e88adf85f76f48f020a6d681f5ff1Marco Nelissenpublic: 55faf4efc6a41e88adf85f76f48f020a6d681f5ff1Marco Nelissen // Extractor assumes ownership of source 56faf4efc6a41e88adf85f76f48f020a6d681f5ff1Marco Nelissen MidiExtractor(const sp<DataSource> &source); 57faf4efc6a41e88adf85f76f48f020a6d681f5ff1Marco Nelissen 58faf4efc6a41e88adf85f76f48f020a6d681f5ff1Marco Nelissen virtual size_t countTracks(); 59b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen virtual sp<IMediaSource> getTrack(size_t index); 60faf4efc6a41e88adf85f76f48f020a6d681f5ff1Marco Nelissen virtual sp<MetaData> getTrackMetaData(size_t index, uint32_t flags); 61faf4efc6a41e88adf85f76f48f020a6d681f5ff1Marco Nelissen 62faf4efc6a41e88adf85f76f48f020a6d681f5ff1Marco Nelissen virtual sp<MetaData> getMetaData(); 63a48a51c056198a778755cbed52884dc30b74ac0aMarco Nelissen virtual const char * name() { return "MidiExtractor"; } 64faf4efc6a41e88adf85f76f48f020a6d681f5ff1Marco Nelissen 65faf4efc6a41e88adf85f76f48f020a6d681f5ff1Marco Nelissenprotected: 66faf4efc6a41e88adf85f76f48f020a6d681f5ff1Marco Nelissen virtual ~MidiExtractor(); 67faf4efc6a41e88adf85f76f48f020a6d681f5ff1Marco Nelissen 68faf4efc6a41e88adf85f76f48f020a6d681f5ff1Marco Nelissenprivate: 69faf4efc6a41e88adf85f76f48f020a6d681f5ff1Marco Nelissen sp<DataSource> mDataSource; 70faf4efc6a41e88adf85f76f48f020a6d681f5ff1Marco Nelissen status_t mInitCheck; 71faf4efc6a41e88adf85f76f48f020a6d681f5ff1Marco Nelissen sp<MetaData> mFileMetadata; 72faf4efc6a41e88adf85f76f48f020a6d681f5ff1Marco Nelissen 73faf4efc6a41e88adf85f76f48f020a6d681f5ff1Marco Nelissen // There is only one track 74faf4efc6a41e88adf85f76f48f020a6d681f5ff1Marco Nelissen sp<MetaData> mTrackMetadata; 75faf4efc6a41e88adf85f76f48f020a6d681f5ff1Marco Nelissen 76faf4efc6a41e88adf85f76f48f020a6d681f5ff1Marco Nelissen sp<MidiEngine> mEngine; 77faf4efc6a41e88adf85f76f48f020a6d681f5ff1Marco Nelissen 78faf4efc6a41e88adf85f76f48f020a6d681f5ff1Marco Nelissen EAS_DATA_HANDLE mEasData; 79faf4efc6a41e88adf85f76f48f020a6d681f5ff1Marco Nelissen EAS_HANDLE mEasHandle; 80faf4efc6a41e88adf85f76f48f020a6d681f5ff1Marco Nelissen EAS_PCM* mAudioBuffer; 81faf4efc6a41e88adf85f76f48f020a6d681f5ff1Marco Nelissen EAS_I32 mPlayTime; 82faf4efc6a41e88adf85f76f48f020a6d681f5ff1Marco Nelissen EAS_I32 mDuration; 83faf4efc6a41e88adf85f76f48f020a6d681f5ff1Marco Nelissen EAS_STATE mState; 84faf4efc6a41e88adf85f76f48f020a6d681f5ff1Marco Nelissen EAS_FILE mFileLocator; 85faf4efc6a41e88adf85f76f48f020a6d681f5ff1Marco Nelissen 86faf4efc6a41e88adf85f76f48f020a6d681f5ff1Marco Nelissen MidiExtractor(const MidiExtractor &); 87faf4efc6a41e88adf85f76f48f020a6d681f5ff1Marco Nelissen MidiExtractor &operator=(const MidiExtractor &); 88faf4efc6a41e88adf85f76f48f020a6d681f5ff1Marco Nelissen 89faf4efc6a41e88adf85f76f48f020a6d681f5ff1Marco Nelissen}; 90faf4efc6a41e88adf85f76f48f020a6d681f5ff1Marco Nelissen 91faf4efc6a41e88adf85f76f48f020a6d681f5ff1Marco Nelissenbool SniffMidi(const sp<DataSource> &source, String8 *mimeType, 92faf4efc6a41e88adf85f76f48f020a6d681f5ff1Marco Nelissen float *confidence, sp<AMessage> *); 93faf4efc6a41e88adf85f76f48f020a6d681f5ff1Marco Nelissen 94faf4efc6a41e88adf85f76f48f020a6d681f5ff1Marco Nelissen} // namespace android 95faf4efc6a41e88adf85f76f48f020a6d681f5ff1Marco Nelissen 96faf4efc6a41e88adf85f76f48f020a6d681f5ff1Marco Nelissen#endif // MIDI_EXTRACTOR_H_ 97