1392ff3b5296e0cee8d5db386d2ef72e2719890c8James Dong/*
2392ff3b5296e0cee8d5db386d2ef72e2719890c8James Dong**
3392ff3b5296e0cee8d5db386d2ef72e2719890c8James Dong** Copyright 2009, The Android Open Source Project
4392ff3b5296e0cee8d5db386d2ef72e2719890c8James Dong**
5392ff3b5296e0cee8d5db386d2ef72e2719890c8James Dong** Licensed under the Apache License, Version 2.0 (the "License");
6392ff3b5296e0cee8d5db386d2ef72e2719890c8James Dong** you may not use this file except in compliance with the License.
7392ff3b5296e0cee8d5db386d2ef72e2719890c8James Dong** You may obtain a copy of the License at
8392ff3b5296e0cee8d5db386d2ef72e2719890c8James Dong**
9392ff3b5296e0cee8d5db386d2ef72e2719890c8James Dong**     http://www.apache.org/licenses/LICENSE-2.0
10392ff3b5296e0cee8d5db386d2ef72e2719890c8James Dong**
11392ff3b5296e0cee8d5db386d2ef72e2719890c8James Dong** Unless required by applicable law or agreed to in writing, software
12392ff3b5296e0cee8d5db386d2ef72e2719890c8James Dong** distributed under the License is distributed on an "AS IS" BASIS,
13392ff3b5296e0cee8d5db386d2ef72e2719890c8James Dong** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14392ff3b5296e0cee8d5db386d2ef72e2719890c8James Dong** See the License for the specific language governing permissions and
15392ff3b5296e0cee8d5db386d2ef72e2719890c8James Dong** limitations under the License.
16392ff3b5296e0cee8d5db386d2ef72e2719890c8James Dong*/
17392ff3b5296e0cee8d5db386d2ef72e2719890c8James Dong
18392ff3b5296e0cee8d5db386d2ef72e2719890c8James Dong//#define LOG_NDEBUG 0
19392ff3b5296e0cee8d5db386d2ef72e2719890c8James Dong#define LOG_TAG "MidiMetadataRetriever"
20392ff3b5296e0cee8d5db386d2ef72e2719890c8James Dong#include <utils/Log.h>
21392ff3b5296e0cee8d5db386d2ef72e2719890c8James Dong
22392ff3b5296e0cee8d5db386d2ef72e2719890c8James Dong#include "MidiMetadataRetriever.h"
23392ff3b5296e0cee8d5db386d2ef72e2719890c8James Dong#include <media/mediametadataretriever.h>
24392ff3b5296e0cee8d5db386d2ef72e2719890c8James Dong
25392ff3b5296e0cee8d5db386d2ef72e2719890c8James Dongnamespace android {
26392ff3b5296e0cee8d5db386d2ef72e2719890c8James Dong
27392ff3b5296e0cee8d5db386d2ef72e2719890c8James Dongstatic status_t ERROR_NOT_OPEN = -1;
28392ff3b5296e0cee8d5db386d2ef72e2719890c8James Dongstatic status_t ERROR_OPEN_FAILED = -2;
29392ff3b5296e0cee8d5db386d2ef72e2719890c8James Dongstatic status_t ERROR_EAS_FAILURE = -3;
30392ff3b5296e0cee8d5db386d2ef72e2719890c8James Dongstatic status_t ERROR_ALLOCATE_FAILED = -4;
31392ff3b5296e0cee8d5db386d2ef72e2719890c8James Dong
32392ff3b5296e0cee8d5db386d2ef72e2719890c8James Dongvoid MidiMetadataRetriever::clearMetadataValues()
33392ff3b5296e0cee8d5db386d2ef72e2719890c8James Dong{
34392ff3b5296e0cee8d5db386d2ef72e2719890c8James Dong    LOGV("clearMetadataValues");
35392ff3b5296e0cee8d5db386d2ef72e2719890c8James Dong    mMetadataValues[0][0] = '\0';
36392ff3b5296e0cee8d5db386d2ef72e2719890c8James Dong}
37392ff3b5296e0cee8d5db386d2ef72e2719890c8James Dong
385b7ced6a4ebcec34a36d0779773bc9e671732dbfAndreas Huberstatus_t MidiMetadataRetriever::setDataSource(
395b7ced6a4ebcec34a36d0779773bc9e671732dbfAndreas Huber        const char *url, const KeyedVector<String8, String8> *headers)
40392ff3b5296e0cee8d5db386d2ef72e2719890c8James Dong{
41392ff3b5296e0cee8d5db386d2ef72e2719890c8James Dong    LOGV("setDataSource: %s", url? url: "NULL pointer");
42392ff3b5296e0cee8d5db386d2ef72e2719890c8James Dong    Mutex::Autolock lock(mLock);
43392ff3b5296e0cee8d5db386d2ef72e2719890c8James Dong    clearMetadataValues();
44392ff3b5296e0cee8d5db386d2ef72e2719890c8James Dong    if (mMidiPlayer == 0) {
45392ff3b5296e0cee8d5db386d2ef72e2719890c8James Dong        mMidiPlayer = new MidiFile();
46392ff3b5296e0cee8d5db386d2ef72e2719890c8James Dong    }
475b7ced6a4ebcec34a36d0779773bc9e671732dbfAndreas Huber    return mMidiPlayer->setDataSource(url, headers);
48392ff3b5296e0cee8d5db386d2ef72e2719890c8James Dong}
49392ff3b5296e0cee8d5db386d2ef72e2719890c8James Dong
50392ff3b5296e0cee8d5db386d2ef72e2719890c8James Dongstatus_t MidiMetadataRetriever::setDataSource(int fd, int64_t offset, int64_t length)
51392ff3b5296e0cee8d5db386d2ef72e2719890c8James Dong{
52392ff3b5296e0cee8d5db386d2ef72e2719890c8James Dong    LOGV("setDataSource: fd(%d), offset(%lld), and length(%lld)", fd, offset, length);
53392ff3b5296e0cee8d5db386d2ef72e2719890c8James Dong    Mutex::Autolock lock(mLock);
54392ff3b5296e0cee8d5db386d2ef72e2719890c8James Dong    clearMetadataValues();
55392ff3b5296e0cee8d5db386d2ef72e2719890c8James Dong    if (mMidiPlayer == 0) {
56392ff3b5296e0cee8d5db386d2ef72e2719890c8James Dong        mMidiPlayer = new MidiFile();
57392ff3b5296e0cee8d5db386d2ef72e2719890c8James Dong    }
58392ff3b5296e0cee8d5db386d2ef72e2719890c8James Dong    return mMidiPlayer->setDataSource(fd, offset, length);;
59392ff3b5296e0cee8d5db386d2ef72e2719890c8James Dong}
60392ff3b5296e0cee8d5db386d2ef72e2719890c8James Dong
61392ff3b5296e0cee8d5db386d2ef72e2719890c8James Dongconst char* MidiMetadataRetriever::extractMetadata(int keyCode)
62392ff3b5296e0cee8d5db386d2ef72e2719890c8James Dong{
63392ff3b5296e0cee8d5db386d2ef72e2719890c8James Dong    LOGV("extractMetdata: key(%d)", keyCode);
64392ff3b5296e0cee8d5db386d2ef72e2719890c8James Dong    Mutex::Autolock lock(mLock);
65392ff3b5296e0cee8d5db386d2ef72e2719890c8James Dong    if (mMidiPlayer == 0 || mMidiPlayer->initCheck() != NO_ERROR) {
66392ff3b5296e0cee8d5db386d2ef72e2719890c8James Dong        LOGE("Midi player is not initialized yet");
67392ff3b5296e0cee8d5db386d2ef72e2719890c8James Dong        return NULL;
68392ff3b5296e0cee8d5db386d2ef72e2719890c8James Dong    }
69392ff3b5296e0cee8d5db386d2ef72e2719890c8James Dong    switch (keyCode) {
70392ff3b5296e0cee8d5db386d2ef72e2719890c8James Dong    case METADATA_KEY_DURATION:
71392ff3b5296e0cee8d5db386d2ef72e2719890c8James Dong        {
72392ff3b5296e0cee8d5db386d2ef72e2719890c8James Dong            if (mMetadataValues[0][0] == '\0') {
73392ff3b5296e0cee8d5db386d2ef72e2719890c8James Dong                int duration = -1;
74392ff3b5296e0cee8d5db386d2ef72e2719890c8James Dong                if (mMidiPlayer->getDuration(&duration) != NO_ERROR) {
75392ff3b5296e0cee8d5db386d2ef72e2719890c8James Dong                    LOGE("failed to get duration");
76392ff3b5296e0cee8d5db386d2ef72e2719890c8James Dong                    return NULL;
77392ff3b5296e0cee8d5db386d2ef72e2719890c8James Dong                }
78392ff3b5296e0cee8d5db386d2ef72e2719890c8James Dong                snprintf(mMetadataValues[0], MAX_METADATA_STRING_LENGTH, "%d", duration);
79392ff3b5296e0cee8d5db386d2ef72e2719890c8James Dong            }
80392ff3b5296e0cee8d5db386d2ef72e2719890c8James Dong
81392ff3b5296e0cee8d5db386d2ef72e2719890c8James Dong            LOGV("duration: %s ms", mMetadataValues[0]);
82392ff3b5296e0cee8d5db386d2ef72e2719890c8James Dong            return mMetadataValues[0];
83392ff3b5296e0cee8d5db386d2ef72e2719890c8James Dong        }
84392ff3b5296e0cee8d5db386d2ef72e2719890c8James Dong    default:
85392ff3b5296e0cee8d5db386d2ef72e2719890c8James Dong        LOGE("Unsupported key code (%d)", keyCode);
86392ff3b5296e0cee8d5db386d2ef72e2719890c8James Dong        return NULL;
87392ff3b5296e0cee8d5db386d2ef72e2719890c8James Dong    }
88392ff3b5296e0cee8d5db386d2ef72e2719890c8James Dong    return NULL;
89392ff3b5296e0cee8d5db386d2ef72e2719890c8James Dong}
90392ff3b5296e0cee8d5db386d2ef72e2719890c8James Dong
91392ff3b5296e0cee8d5db386d2ef72e2719890c8James Dong};
92392ff3b5296e0cee8d5db386d2ef72e2719890c8James Dong
93