/* * Copyright (C) 2010 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** \file IID_to_MPH.c Interface ID to MPH mapping */ #include "SLES/OpenSLES.h" #include "MPH.h" #include <assert.h> #include <string.h> extern const struct SLInterfaceID_ SL_IID_array[MPH_MAX]; /** \brief Map SLInterfaceID to its minimal perfect hash (MPH), or -1 if unknown */ int IID_to_MPH(const SLInterfaceID iid) { #define MAX_HASH_VALUE 115 static const unsigned char asso_values[] = { 5, 116, 116, 61, 116, 116, 7, 116, 116, 7, 116, 12, 116, 116, 116, 46, 116, 116, 116, 116, 116, 116, 56, 116, 116, 36, 116, 116, 116, 116, 116, 7, 20, 116, 116, 116, 116, 116, 116, 116, 116, 116, 41, 20, 36, 116, 21, 116, 116, 116, 116, 116, 116, 26, 116, 2, 116, 116, 116, 116, 116, 51, 116, 51, 55, 116, 116, 116, 116, 116, 116, 16, 116, 116, 116, 116, 116, 116, 116, 116, 21, 116, 116, 116, 116, 116, 26, 116, 116, 116, 11, 116, 116, 116, 116, 116, 40, 11, 116, 60, 116, 116, 116, 116, 116, 116, 6, 116, 116, 116, 116, 116, 1, 116, 116, 116, 116, 116, 116, 116, 116, 1, 55, 6, 116, 116, 116, 116, 45, 116, 116, 1, 116, 116, 116, 116, 116, 1, 116, 116, 116, 60, 116, 116, 116, 116, 116, 116, 116, 116, 116, 55, 116, 116, 116, 116, 116, 116, 116, 116, 10, 116, 116, 116, 116, 116, 116, 116, 116, 116, 45, 116, 116, 116, 40, 116, 116, 116, 55, 116, 40, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 15, 116, 35, 116, 45, 5, 116, 50, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 40, 116, 116, 50, 116, 116, 116, 116, 116, 25, 116, 116, 15, 35, 116, 116, 10, 116, 116, 116, 116, 116, 116, 10, 0, 116, 116, 15, 30, 116, 116, 116, 116, 116, 55, 116, 116, 116, 116, 116, 116, 116, 0, 116 }; static const signed char hash_to_MPH[] = { MPH_NULL, -1, -1, -1, -1, MPH_OUTPUTMIXEXT, MPH_3DSOURCE, MPH_VIRTUALIZER, -1, -1, MPH_DYNAMICSOURCE, MPH_ENGINECAPABILITIES, MPH_MIDITEMPO, -1, -1, MPH_RECORD, MPH_ANDROIDCONFIGURATION, MPH_EQUALIZER, -1, -1, MPH_VISUALIZATION, MPH_ANDROIDEFFECTSEND, MPH_VOLUME, -1, -1, MPH_3DGROUPING, MPH_MUTESOLO, MPH_BASSBOOST, -1, -1, MPH_PLAY, MPH_EFFECTSEND, -1, -1, -1, MPH_BUFFERQUEUE, MPH_3DMACROSCOPIC, -1, -1, -1, MPH_3DLOCATION, MPH_OBJECT, -1, -1, -1, MPH_MIDIMESSAGE, MPH_ANDROIDEFFECTCAPABILITIES, -1, -1, -1, MPH_SEEK, MPH_RATEPITCH, -1, -1, -1, MPH_PITCH, MPH_PRESETREVERB, -1, -1, -1, MPH_METADATATRAVERSAL, MPH_AUDIODECODERCAPABILITIES, -1, -1, -1, MPH_ENVIRONMENTALREVERB, MPH_MIDITIME, -1, -1, -1, MPH_AUDIOIODEVICECAPABILITIES, MPH_3DCOMMIT, -1, -1, -1, MPH_DEVICEVOLUME, MPH_PLAYBACKRATE, -1, -1, -1, MPH_ANDROIDEFFECT, MPH_LED, -1, -1, -1, MPH_3DDOPPLER, MPH_PREFETCHSTATUS, -1, -1, -1, MPH_METADATAEXTRACTION, MPH_ANDROIDSIMPLEBUFFERQUEUE, -1, -1, -1, MPH_OUTPUTMIX, MPH_VIBRA, -1, -1, -1, MPH_ENGINE, MPH_AUDIOENCODERCAPABILITIES, -1, -1, -1, MPH_AUDIOENCODER, MPH_MIDIMUTESOLO, -1, -1, -1, MPH_THREADSYNC, -1, -1, -1, -1, MPH_DYNAMICINTERFACEMANAGEMENT }; if (&SL_IID_array[0] <= iid && &SL_IID_array[MPH_MAX] > iid) return iid - &SL_IID_array[0]; if (NULL != iid) { unsigned key = asso_values[((unsigned char *)iid)[3]] + asso_values[((unsigned char *)iid)[0]]; if (key <= MAX_HASH_VALUE) { int MPH = hash_to_MPH[key]; if (MPH >= 0) { assert(MPH < MPH_MAX); SLInterfaceID trial = &SL_IID_array[MPH]; if (!memcmp(iid, trial, sizeof(struct SLInterfaceID_))) return MPH; } } } return -1; }