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