161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten/* 261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten * Copyright (C) 2010 The Android Open Source Project 361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten * 461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten * Licensed under the Apache License, Version 2.0 (the "License"); 561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten * you may not use this file except in compliance with the License. 661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten * You may obtain a copy of the License at 761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten * 861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten * http://www.apache.org/licenses/LICENSE-2.0 961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten * 1061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten * Unless required by applicable law or agreed to in writing, software 1161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten * distributed under the License is distributed on an "AS IS" BASIS, 1261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten * See the License for the specific language governing permissions and 1461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten * limitations under the License. 1561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten */ 1661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten 1761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten/* Vibra implementation */ 1861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten 1961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten#include "sles_allinclusive.h" 2061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten 21ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 2261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenstatic SLresult IVibra_Vibrate(SLVibraItf self, SLboolean vibrate) 2361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{ 24ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 25ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 26bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten IVibra *thiz = (IVibra *) self; 27bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_lock_poke(thiz); 28bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mVibrate = SL_BOOLEAN_FALSE != vibrate; // normalize 29bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_unlock_poke(thiz); 30ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 31ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 32ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 3361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten} 3461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten 35ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 3661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenstatic SLresult IVibra_IsVibrating(SLVibraItf self, SLboolean *pVibrating) 3761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{ 38ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 39ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 40ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (NULL == pVibrating) { 41ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 42ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 43bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten IVibra *thiz = (IVibra *) self; 44bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_lock_peek(thiz); 45bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten SLboolean vibrate = thiz->mVibrate; 46bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_unlock_peek(thiz); 47ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten *pVibrating = vibrate; 48ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 49ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 50ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 51ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 5261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten} 5361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten 54ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 5561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenstatic SLresult IVibra_SetFrequency(SLVibraItf self, SLmilliHertz frequency) 5661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{ 57ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 58ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 59d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten const SLVibraDescriptor *d = Vibra_id_descriptors[0].descriptor; 60ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (!d->supportsFrequency) { 61ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PRECONDITIONS_VIOLATED; 62ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else if (!(d->minFrequency <= frequency && frequency <= d->maxFrequency)) { 63ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 64ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 65bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten IVibra *thiz = (IVibra *) self; 66bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_lock_poke(thiz); 67bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mFrequency = frequency; 68bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_unlock_poke(thiz); 69ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 70ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 71ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 72ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 7361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten} 7461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten 75ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 7661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenstatic SLresult IVibra_GetFrequency(SLVibraItf self, SLmilliHertz *pFrequency) 7761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{ 78ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 79ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 80ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (NULL == pFrequency) { 81ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 82ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 83bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten IVibra *thiz = (IVibra *) self; 84bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_lock_peek(thiz); 85bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten SLmilliHertz frequency = thiz->mFrequency; 86bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_unlock_peek(thiz); 87ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten *pFrequency = frequency; 88ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 89ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 90ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 91ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 9261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten} 9361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten 94ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 9561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenstatic SLresult IVibra_SetIntensity(SLVibraItf self, SLpermille intensity) 9661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{ 97ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 98ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 99d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten const SLVibraDescriptor *d = Vibra_id_descriptors[0].descriptor; 100ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (!d->supportsIntensity) { 101ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PRECONDITIONS_VIOLATED; 102ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else if (!(0 <= intensity && intensity <= 1000)) { 103ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 104ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 105bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten IVibra *thiz = (IVibra *) self; 106bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_lock_poke(thiz); 107bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mIntensity = intensity; 108bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_unlock_poke(thiz); 109ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 110ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 111ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 112ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 11361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten} 11461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten 115ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 11661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenstatic SLresult IVibra_GetIntensity(SLVibraItf self, SLpermille *pIntensity) 11761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{ 118ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 119ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 120ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (NULL == pIntensity) { 121ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 122ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 123ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten const SLVibraDescriptor *d = Vibra_id_descriptors[0].descriptor; 124ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (!d->supportsIntensity) { 125ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PRECONDITIONS_VIOLATED; 126ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 127bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten IVibra *thiz = (IVibra *) self; 128bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_lock_peek(thiz); 129bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten SLpermille intensity = thiz->mIntensity; 130bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_unlock_peek(thiz); 131ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten *pIntensity = intensity; 132ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 133ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 134ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 135ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 136ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 13761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten} 13861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten 139ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 14061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenstatic const struct SLVibraItf_ IVibra_Itf = { 14161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten IVibra_Vibrate, 14261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten IVibra_IsVibrating, 14361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten IVibra_SetFrequency, 14461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten IVibra_GetFrequency, 14561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten IVibra_SetIntensity, 14661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten IVibra_GetIntensity 14761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten}; 14861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten 14961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenvoid IVibra_init(void *self) 15061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{ 151bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten IVibra *thiz = (IVibra *) self; 152bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mItf = &IVibra_Itf; 153bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mVibrate = SL_BOOLEAN_FALSE; 154d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten // next 2 values are undefined per spec 155bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mFrequency = Vibra_id_descriptors[0].descriptor->minFrequency; 156bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mIntensity = 1000; 15761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten} 158