/*
 * 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.
 */

// This file is automagically generated by hashgen, do not edit

/** \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 180
  static const unsigned char asso_values[] =
    {
       35,  20,  79,  99, 181, 181,  74, 181, 181, 181,
      181, 181, 181, 181,  84, 181,  79,  59, 181, 181,
      181, 181,  54, 181,  69,  39, 181, 181,  29, 181,
      181,  85,   5, 181, 181, 181, 181, 181,  49, 181,
       24, 181, 181, 181,  14, 181, 117, 181, 181, 181,
      181, 181,   9, 181, 181, 181, 181, 181,  14, 100,
      181,   9,  24, 181,  50, 181, 181, 181, 181, 127,
      181, 181, 107,  85, 181, 181, 181, 181, 181, 181,
      181, 181, 181, 181, 181, 181, 127, 181,  19, 181,
      181, 181,   9, 181, 181, 181,  25, 122,  14, 107,
      181, 181, 181, 181, 181, 181, 181,   4, 181, 102,
      181, 181,   0, 181,   4,  97, 122, 181,  72,  45,
      181, 181, 105, 181, 181, 181,  87, 181,  30, 181,
      181, 181, 181, 181, 181, 107, 125, 181, 181, 181,
      181, 181,  80,  82, 181,  77, 181, 120, 181, 181,
      181, 181, 181,  97, 181, 181,  87, 181, 181,  65,
        5, 181,  57, 181, 181,  82, 115, 181, 181,  52,
      181,  72,  55, 181, 181,  62, 181,  45, 181, 181,
      181, 181,  32, 181,  32,  30, 181, 181, 181, 181,
      181, 181,   0, 181, 181, 181, 110,  47, 181, 181,
      181, 181, 181, 181, 181, 181, 120, 181, 181, 181,
      100,  47, 181, 181, 181,  37, 181, 181,   2, 181,
      181, 181, 181,  27,  10, 181, 181,  27, 181, 181,
      181, 181, 181, 181,  22, 181,  75, 181, 181, 181,
       10,  12, 181, 181,  70, 181,   7,   7, 181, 181,
      181, 105,   2, 125, 181, 181
    };
    static const signed char hash_to_MPH[] = {
        MPH_ANDROIDEFFECTSEND,
        -1,
        MPH_XADYNAMICINTERFACEMANAGEMENT,
        -1,
        MPH_XAAUDIODECODERCAPABILITIES,
        MPH_XALED,
        -1,
        MPH_BASSBOOST,
        -1,
        MPH_XAOUTPUTMIX,
        MPH_MIDITIME,
        -1,
        MPH_RECORD,
        -1,
        MPH_AUDIOIODEVICECAPABILITIES,
        MPH_MUTESOLO,
        -1,
        MPH_VOLUME,
        -1,
        MPH_ANDROIDCONFIGURATION,
        MPH_XASNAPSHOT,
        -1,
        MPH_XAIMAGECONTROLS,
        -1,
        MPH_SEEK,
        MPH_3DLOCATION,
        -1,
        MPH_XATHREADSYNC,
        -1,
        MPH_XAIMAGEDECODERCAPABILITIES,
        MPH_XACAMERACAPABILITIES,
        -1,
        MPH_XAVOLUME,
        -1,
        MPH_VIBRA,
        MPH_XAIMAGEEFFECTS,
        -1,
        MPH_XAPLAY,
        -1,
        MPH_PRESETREVERB,
        MPH_XAOBJECT,
        -1,
        MPH_XACONFIGEXTENSION,
        -1,
        MPH_EQUALIZER,
        MPH_XAVIBRA,
        -1,
        MPH_3DMACROSCOPIC,
        -1,
        MPH_PITCH,
        MPH_ENGINECAPABILITIES,
        -1,
        MPH_XAMETADATAEXTRACTION,
        -1,
        MPH_3DDOPPLER,
        MPH_XAVIDEODECODERCAPABILITIES,
        -1,
        MPH_RATEPITCH,
        -1,
        MPH_ANDROIDAUTOMATICGAINCONTROL,
        MPH_AUDIODECODERCAPABILITIES,
        -1,
        MPH_XARADIO,
        -1,
        MPH_OUTPUTMIXEXT,
        MPH_ENVIRONMENTALREVERB,
        -1,
        MPH_XAVIDEOPOSTPROCESSING,
        -1,
        MPH_3DCOMMIT,
        MPH_OUTPUTMIX,
        -1,
        MPH_METADATATRAVERSAL,
        -1,
        MPH_XASEEK,
        MPH_XASTREAMINFORMATION,
        -1,
        MPH_DEVICEVOLUME,
        -1,
        MPH_OBJECT,
        MPH_VIRTUALIZER,
        -1,
        MPH_XARDS,
        -1,
        MPH_XAVIDEOENCODER,
        MPH_PLAY,
        -1,
        MPH_XADYNAMICSOURCE,
        -1,
        MPH_3DGROUPING,
        MPH_XAVIDEOENCODERCAPABILITIES,
        -1,
        MPH_XAPREFETCHSTATUS,
        -1,
        MPH_XAMETADATATRAVERSAL,
        MPH_XAEQUALIZER,
        -1,
        MPH_BUFFERQUEUE,
        -1,
        MPH_ANDROIDBUFFERQUEUESOURCE,
        MPH_XARECORD,
        -1,
        MPH_XAMETADATAINSERTION,
        -1,
        MPH_XADEVICEVOLUME,
        MPH_ANDROIDNOISESUPPRESSION,
        -1,
        MPH_ENGINE,
        -1,
        MPH_MIDIMUTESOLO,
        MPH_METADATAEXTRACTION,
        -1,
        MPH_XACAMERA,
        -1,
        -1,
        MPH_PREFETCHSTATUS,
        -1,
        MPH_LED,
        -1,
        -1,
        MPH_XAAUDIOENCODER,
        -1,
        MPH_XAENGINE,
        -1,
        -1,
        MPH_ANDROIDEFFECTCAPABILITIES,
        -1,
        MPH_MIDIMESSAGE,
        -1,
        -1,
        MPH_VISUALIZATION,
        -1,
        MPH_3DSOURCE,
        -1,
        -1,
        MPH_PLAYBACKRATE,
        -1,
        MPH_XAAUDIOENCODERCAPABILITIES,
        -1,
        -1,
        MPH_EFFECTSEND,
        -1,
        MPH_XAAUDIOIODEVICECAPABILITIES,
        -1,
        -1,
        MPH_NULL,
        -1,
        MPH_ANDROIDACOUSTICECHOCANCELLATION,
        -1,
        -1,
        MPH_XAIMAGEENCODERCAPABILITIES,
        -1,
        MPH_ANDROIDEFFECT,
        -1,
        -1,
        MPH_MIDITEMPO,
        -1,
        MPH_XAPLAYBACKRATE,
        -1,
        -1,
        MPH_DYNAMICINTERFACEMANAGEMENT,
        -1,
        MPH_DYNAMICSOURCE,
        -1,
        -1,
        MPH_ANDROIDSIMPLEBUFFERQUEUE,
        -1,
        MPH_THREADSYNC,
        -1,
        -1,
        MPH_AUDIOENCODERCAPABILITIES,
        -1,
        -1,
        -1,
        -1,
        MPH_XAIMAGEENCODER,
        -1,
        -1,
        -1,
        -1,
        MPH_AUDIOENCODER
    };
    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)[8]] +
            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;
}
