1148c1a2a96774517407717b61e5bc9cb08be8806James Dong/*
2148c1a2a96774517407717b61e5bc9cb08be8806James Dong**
3148c1a2a96774517407717b61e5bc9cb08be8806James Dong** Copyright 2009, The Android Open Source Project
4148c1a2a96774517407717b61e5bc9cb08be8806James Dong**
5148c1a2a96774517407717b61e5bc9cb08be8806James Dong** Licensed under the Apache License, Version 2.0 (the "License");
6148c1a2a96774517407717b61e5bc9cb08be8806James Dong** you may not use this file except in compliance with the License.
7148c1a2a96774517407717b61e5bc9cb08be8806James Dong** You may obtain a copy of the License at
8148c1a2a96774517407717b61e5bc9cb08be8806James Dong**
9148c1a2a96774517407717b61e5bc9cb08be8806James Dong**     http://www.apache.org/licenses/LICENSE-2.0
10148c1a2a96774517407717b61e5bc9cb08be8806James Dong**
11148c1a2a96774517407717b61e5bc9cb08be8806James Dong** Unless required by applicable law or agreed to in writing, software
12148c1a2a96774517407717b61e5bc9cb08be8806James Dong** distributed under the License is distributed on an "AS IS" BASIS,
13148c1a2a96774517407717b61e5bc9cb08be8806James Dong** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14148c1a2a96774517407717b61e5bc9cb08be8806James Dong** See the License for the specific language governing permissions and
15148c1a2a96774517407717b61e5bc9cb08be8806James Dong** limitations under the License.
16148c1a2a96774517407717b61e5bc9cb08be8806James Dong*/
17148c1a2a96774517407717b61e5bc9cb08be8806James Dong
18148c1a2a96774517407717b61e5bc9cb08be8806James Dong//#define LOG_NDEBUG 0
19148c1a2a96774517407717b61e5bc9cb08be8806James Dong#define LOG_TAG "MidiMetadataRetriever"
20148c1a2a96774517407717b61e5bc9cb08be8806James Dong#include <utils/Log.h>
21148c1a2a96774517407717b61e5bc9cb08be8806James Dong
22148c1a2a96774517407717b61e5bc9cb08be8806James Dong#include "MidiMetadataRetriever.h"
23148c1a2a96774517407717b61e5bc9cb08be8806James Dong#include <media/mediametadataretriever.h>
24148c1a2a96774517407717b61e5bc9cb08be8806James Dong
251b86fe063badb5f28c467ade39be0f4008688947Andreas Huber#include <media/IMediaHTTPService.h>
261b86fe063badb5f28c467ade39be0f4008688947Andreas Huber
27148c1a2a96774517407717b61e5bc9cb08be8806James Dongnamespace android {
28148c1a2a96774517407717b61e5bc9cb08be8806James Dong
29148c1a2a96774517407717b61e5bc9cb08be8806James Dongstatic status_t ERROR_NOT_OPEN = -1;
30148c1a2a96774517407717b61e5bc9cb08be8806James Dongstatic status_t ERROR_OPEN_FAILED = -2;
31148c1a2a96774517407717b61e5bc9cb08be8806James Dongstatic status_t ERROR_EAS_FAILURE = -3;
32148c1a2a96774517407717b61e5bc9cb08be8806James Dongstatic status_t ERROR_ALLOCATE_FAILED = -4;
33148c1a2a96774517407717b61e5bc9cb08be8806James Dong
34148c1a2a96774517407717b61e5bc9cb08be8806James Dongvoid MidiMetadataRetriever::clearMetadataValues()
35148c1a2a96774517407717b61e5bc9cb08be8806James Dong{
363856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("clearMetadataValues");
37148c1a2a96774517407717b61e5bc9cb08be8806James Dong    mMetadataValues[0][0] = '\0';
38148c1a2a96774517407717b61e5bc9cb08be8806James Dong}
39148c1a2a96774517407717b61e5bc9cb08be8806James Dong
40af8791e112c8072452bd14ef3c43a47511d19542Andreas Huberstatus_t MidiMetadataRetriever::setDataSource(
411b86fe063badb5f28c467ade39be0f4008688947Andreas Huber        const sp<IMediaHTTPService> &httpService,
421b86fe063badb5f28c467ade39be0f4008688947Andreas Huber        const char *url,
431b86fe063badb5f28c467ade39be0f4008688947Andreas Huber        const KeyedVector<String8, String8> *headers)
44148c1a2a96774517407717b61e5bc9cb08be8806James Dong{
453856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("setDataSource: %s", url? url: "NULL pointer");
46148c1a2a96774517407717b61e5bc9cb08be8806James Dong    Mutex::Autolock lock(mLock);
47148c1a2a96774517407717b61e5bc9cb08be8806James Dong    clearMetadataValues();
48148c1a2a96774517407717b61e5bc9cb08be8806James Dong    if (mMidiPlayer == 0) {
49148c1a2a96774517407717b61e5bc9cb08be8806James Dong        mMidiPlayer = new MidiFile();
50148c1a2a96774517407717b61e5bc9cb08be8806James Dong    }
511b86fe063badb5f28c467ade39be0f4008688947Andreas Huber    return mMidiPlayer->setDataSource(httpService, url, headers);
52148c1a2a96774517407717b61e5bc9cb08be8806James Dong}
53148c1a2a96774517407717b61e5bc9cb08be8806James Dong
54148c1a2a96774517407717b61e5bc9cb08be8806James Dongstatus_t MidiMetadataRetriever::setDataSource(int fd, int64_t offset, int64_t length)
55148c1a2a96774517407717b61e5bc9cb08be8806James Dong{
563856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("setDataSource: fd(%d), offset(%lld), and length(%lld)", fd, offset, length);
57148c1a2a96774517407717b61e5bc9cb08be8806James Dong    Mutex::Autolock lock(mLock);
58148c1a2a96774517407717b61e5bc9cb08be8806James Dong    clearMetadataValues();
59148c1a2a96774517407717b61e5bc9cb08be8806James Dong    if (mMidiPlayer == 0) {
60148c1a2a96774517407717b61e5bc9cb08be8806James Dong        mMidiPlayer = new MidiFile();
61148c1a2a96774517407717b61e5bc9cb08be8806James Dong    }
62148c1a2a96774517407717b61e5bc9cb08be8806James Dong    return mMidiPlayer->setDataSource(fd, offset, length);;
63148c1a2a96774517407717b61e5bc9cb08be8806James Dong}
64148c1a2a96774517407717b61e5bc9cb08be8806James Dong
65148c1a2a96774517407717b61e5bc9cb08be8806James Dongconst char* MidiMetadataRetriever::extractMetadata(int keyCode)
66148c1a2a96774517407717b61e5bc9cb08be8806James Dong{
673856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("extractMetdata: key(%d)", keyCode);
68148c1a2a96774517407717b61e5bc9cb08be8806James Dong    Mutex::Autolock lock(mLock);
69148c1a2a96774517407717b61e5bc9cb08be8806James Dong    if (mMidiPlayer == 0 || mMidiPlayer->initCheck() != NO_ERROR) {
7029357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("Midi player is not initialized yet");
71148c1a2a96774517407717b61e5bc9cb08be8806James Dong        return NULL;
72148c1a2a96774517407717b61e5bc9cb08be8806James Dong    }
73148c1a2a96774517407717b61e5bc9cb08be8806James Dong    switch (keyCode) {
74148c1a2a96774517407717b61e5bc9cb08be8806James Dong    case METADATA_KEY_DURATION:
75148c1a2a96774517407717b61e5bc9cb08be8806James Dong        {
76148c1a2a96774517407717b61e5bc9cb08be8806James Dong            if (mMetadataValues[0][0] == '\0') {
77148c1a2a96774517407717b61e5bc9cb08be8806James Dong                int duration = -1;
78148c1a2a96774517407717b61e5bc9cb08be8806James Dong                if (mMidiPlayer->getDuration(&duration) != NO_ERROR) {
7929357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block                    ALOGE("failed to get duration");
80148c1a2a96774517407717b61e5bc9cb08be8806James Dong                    return NULL;
81148c1a2a96774517407717b61e5bc9cb08be8806James Dong                }
82148c1a2a96774517407717b61e5bc9cb08be8806James Dong                snprintf(mMetadataValues[0], MAX_METADATA_STRING_LENGTH, "%d", duration);
83148c1a2a96774517407717b61e5bc9cb08be8806James Dong            }
84148c1a2a96774517407717b61e5bc9cb08be8806James Dong
853856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("duration: %s ms", mMetadataValues[0]);
86148c1a2a96774517407717b61e5bc9cb08be8806James Dong            return mMetadataValues[0];
87148c1a2a96774517407717b61e5bc9cb08be8806James Dong        }
88148c1a2a96774517407717b61e5bc9cb08be8806James Dong    default:
8929357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("Unsupported key code (%d)", keyCode);
90148c1a2a96774517407717b61e5bc9cb08be8806James Dong        return NULL;
91148c1a2a96774517407717b61e5bc9cb08be8806James Dong    }
92148c1a2a96774517407717b61e5bc9cb08be8806James Dong    return NULL;
93148c1a2a96774517407717b61e5bc9cb08be8806James Dong}
94148c1a2a96774517407717b61e5bc9cb08be8806James Dong
95148c1a2a96774517407717b61e5bc9cb08be8806James Dong};
96148c1a2a96774517407717b61e5bc9cb08be8806James Dong
97