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