1 /* 2 * Copyright (C) 2010 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 /* Vibra implementation */ 18 19 #include "sles_allinclusive.h" 20 21 22 static SLresult IVibra_Vibrate(SLVibraItf self, SLboolean vibrate) 23 { 24 SL_ENTER_INTERFACE 25 26 IVibra *thiz = (IVibra *) self; 27 interface_lock_poke(thiz); 28 thiz->mVibrate = SL_BOOLEAN_FALSE != vibrate; // normalize 29 interface_unlock_poke(thiz); 30 result = SL_RESULT_SUCCESS; 31 32 SL_LEAVE_INTERFACE 33 } 34 35 36 static SLresult IVibra_IsVibrating(SLVibraItf self, SLboolean *pVibrating) 37 { 38 SL_ENTER_INTERFACE 39 40 if (NULL == pVibrating) { 41 result = SL_RESULT_PARAMETER_INVALID; 42 } else { 43 IVibra *thiz = (IVibra *) self; 44 interface_lock_peek(thiz); 45 SLboolean vibrate = thiz->mVibrate; 46 interface_unlock_peek(thiz); 47 *pVibrating = vibrate; 48 result = SL_RESULT_SUCCESS; 49 } 50 51 SL_LEAVE_INTERFACE 52 } 53 54 55 static SLresult IVibra_SetFrequency(SLVibraItf self, SLmilliHertz frequency) 56 { 57 SL_ENTER_INTERFACE 58 59 const SLVibraDescriptor *d = Vibra_id_descriptors[0].descriptor; 60 if (!d->supportsFrequency) { 61 result = SL_RESULT_PRECONDITIONS_VIOLATED; 62 } else if (!(d->minFrequency <= frequency && frequency <= d->maxFrequency)) { 63 result = SL_RESULT_PARAMETER_INVALID; 64 } else { 65 IVibra *thiz = (IVibra *) self; 66 interface_lock_poke(thiz); 67 thiz->mFrequency = frequency; 68 interface_unlock_poke(thiz); 69 result = SL_RESULT_SUCCESS; 70 } 71 72 SL_LEAVE_INTERFACE 73 } 74 75 76 static SLresult IVibra_GetFrequency(SLVibraItf self, SLmilliHertz *pFrequency) 77 { 78 SL_ENTER_INTERFACE 79 80 if (NULL == pFrequency) { 81 result = SL_RESULT_PARAMETER_INVALID; 82 } else { 83 IVibra *thiz = (IVibra *) self; 84 interface_lock_peek(thiz); 85 SLmilliHertz frequency = thiz->mFrequency; 86 interface_unlock_peek(thiz); 87 *pFrequency = frequency; 88 result = SL_RESULT_SUCCESS; 89 } 90 91 SL_LEAVE_INTERFACE 92 } 93 94 95 static SLresult IVibra_SetIntensity(SLVibraItf self, SLpermille intensity) 96 { 97 SL_ENTER_INTERFACE 98 99 const SLVibraDescriptor *d = Vibra_id_descriptors[0].descriptor; 100 if (!d->supportsIntensity) { 101 result = SL_RESULT_PRECONDITIONS_VIOLATED; 102 } else if (!(0 <= intensity && intensity <= 1000)) { 103 result = SL_RESULT_PARAMETER_INVALID; 104 } else { 105 IVibra *thiz = (IVibra *) self; 106 interface_lock_poke(thiz); 107 thiz->mIntensity = intensity; 108 interface_unlock_poke(thiz); 109 result = SL_RESULT_SUCCESS; 110 } 111 112 SL_LEAVE_INTERFACE 113 } 114 115 116 static SLresult IVibra_GetIntensity(SLVibraItf self, SLpermille *pIntensity) 117 { 118 SL_ENTER_INTERFACE 119 120 if (NULL == pIntensity) { 121 result = SL_RESULT_PARAMETER_INVALID; 122 } else { 123 const SLVibraDescriptor *d = Vibra_id_descriptors[0].descriptor; 124 if (!d->supportsIntensity) { 125 result = SL_RESULT_PRECONDITIONS_VIOLATED; 126 } else { 127 IVibra *thiz = (IVibra *) self; 128 interface_lock_peek(thiz); 129 SLpermille intensity = thiz->mIntensity; 130 interface_unlock_peek(thiz); 131 *pIntensity = intensity; 132 result = SL_RESULT_SUCCESS; 133 } 134 } 135 136 SL_LEAVE_INTERFACE 137 } 138 139 140 static const struct SLVibraItf_ IVibra_Itf = { 141 IVibra_Vibrate, 142 IVibra_IsVibrating, 143 IVibra_SetFrequency, 144 IVibra_GetFrequency, 145 IVibra_SetIntensity, 146 IVibra_GetIntensity 147 }; 148 149 void IVibra_init(void *self) 150 { 151 IVibra *thiz = (IVibra *) self; 152 thiz->mItf = &IVibra_Itf; 153 thiz->mVibrate = SL_BOOLEAN_FALSE; 154 // next 2 values are undefined per spec 155 thiz->mFrequency = Vibra_id_descriptors[0].descriptor->minFrequency; 156 thiz->mIntensity = 1000; 157 } 158