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