<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>ALLEGRO_HAPTIC or force feedback for Allegro</title>
		<link>http://www.allegro.cc/forums/view/612754</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Tue, 11 Jun 2013 08:50:34 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Since I found out that both Linux and my cheap USB joystick support force feedback, I&#39;m interested in developing support for force feedback, or for haptic devices for short, also in Allegro. Now, on the PC platform, and certainly on Linux, almost no game uses haptic effects since no one knows how to program them. So support for haptic devices in Allegro would be nice. Also, SDL2 will also support haptic effects, so that&#39;s another reason I don&#39;t want Allegro to fall behind. </p><p>Anyway, I started work on this, but Thomas suggested that I first post the API I suggest here, so we can discuss and improve it. So please read this proposal for allegro5/haptic.h and tell me what you like, dislike and find unclear about it. Without more ado, here is the content of the file (also attached for use at your leasure). </p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">   1</span><span class="c">/*         ______   ___    ___</span>
<span class="number">   2</span><span class="c"> *        /\  _  \ /_ \  /_ \</span>
<span class="number">   3</span><span class="c"> *        \ \ \L\ \//\ \ //\ \      __     __   _ __   ___</span>
<span class="number">   4</span><span class="c"> *         \ \  __ \ \ \ \  \ \ \   /'__`\ /'_ `/`'__/ __`\</span>
<span class="number">   5</span><span class="c"> *          \ \ /\ \ _\ _ _\ _/\  __//\ \L\ \ \ //\ \L\ \</span>
<span class="number">   6</span><span class="c"> *           \ _\ _/____/____\ ____\ ____ \ _\\ ____/</span>
<span class="number">   7</span><span class="c"> *            /_//_//____//____//____//___L\ /_/ /___/</span>
<span class="number">   8</span><span class="c"> *                                           /____/</span>
<span class="number">   9</span><span class="c"> *                                           _/__/</span>
<span class="number">  10</span><span class="c"> *</span>
<span class="number">  11</span><span class="c"> *      Haptic (that is, force feedback) routines for Allegro.</span>
<span class="number">  12</span><span class="c"> *      By Beoran (beoran@gmail.com), 2013.</span>
<span class="number">  13</span><span class="c"> *</span>
<span class="number">  14</span><span class="c"> *      See readme.txt for copyright information.</span>
<span class="number">  15</span><span class="c"> */</span>
<span class="number">  16</span>
<span class="number">  17</span><span class="p">#ifndef __al_included_allegro5_haptic_h</span>
<span class="number">  18</span><span class="p">#define __al_included_allegro5_haptic_h</span>
<span class="number">  19</span>
<span class="number">  20</span><span class="p">#include "allegro5/base.h"</span>
<span class="number">  21</span><span class="p">#include "allegro5/events.h"</span>
<span class="number">  22</span><span class="p">#include "allegro5/mouse.h"</span>
<span class="number">  23</span><span class="p">#include "allegro5/joystick.h"</span>
<span class="number">  24</span>
<span class="number">  25</span><span class="p">#ifdef __cplusplus</span>
<span class="number">  26</span>   <span class="k1">extern</span> <span class="s">"C"</span> <span class="k2">{</span>
<span class="number">  27</span><span class="p">#endif</span>
<span class="number">  28</span>
<span class="number">  29</span><span class="c">/* Enum: ALLEGRO_HAPTIC_CONSTANTS</span>
<span class="number">  30</span><span class="c"> */</span>
<span class="number">  31</span><span class="k1">enum</span> ALLEGRO_HAPTIC_CONSTANTS <span class="k2">{</span>
<span class="number">  32</span>  ALLEGRO_HAPTIC_RUMBLE       <span class="k3">=</span> <span class="n">1</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="n">0</span>,
<span class="number">  33</span>  ALLEGRO_HAPTIC_PERIODIC     <span class="k3">=</span> <span class="n">1</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="n">1</span>,
<span class="number">  34</span>  ALLEGRO_HAPTIC_CONSTANT     <span class="k3">=</span> <span class="n">1</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="n">2</span>,
<span class="number">  35</span>  ALLEGRO_HAPTIC_SPRING       <span class="k3">=</span> <span class="n">1</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="n">3</span>,
<span class="number">  36</span>  ALLEGRO_HAPTIC_FRICTION     <span class="k3">=</span> <span class="n">1</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="n">4</span>,
<span class="number">  37</span>  ALLEGRO_HAPTIC_DAMPER       <span class="k3">=</span> <span class="n">1</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="n">5</span>,
<span class="number">  38</span>  ALLEGRO_HAPTIC_INERTIA      <span class="k3">=</span> <span class="n">1</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="n">6</span>,
<span class="number">  39</span>  ALLEGRO_HAPTIC_RAMP         <span class="k3">=</span> <span class="n">1</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="n">7</span>,
<span class="number">  40</span>  ALLEGRO_HAPTIC_SQUARE       <span class="k3">=</span> <span class="n">1</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="n">8</span>,
<span class="number">  41</span>  ALLEGRO_HAPTIC_TRIANGLE     <span class="k3">=</span> <span class="n">1</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="n">9</span>,
<span class="number">  42</span>  ALLEGRO_HAPTIC_SINE         <span class="k3">=</span> <span class="n">1</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="n">10</span>,
<span class="number">  43</span>  ALLEGRO_HAPTIC_SAW_UP       <span class="k3">=</span> <span class="n">1</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="n">11</span>,
<span class="number">  44</span>  ALLEGRO_HAPTIC_SAW_DOWN     <span class="k3">=</span> <span class="n">1</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="n">12</span>,
<span class="number">  45</span>  ALLEGRO_HAPTIC_CUSTOM       <span class="k3">=</span> <span class="n">1</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="n">13</span>,
<span class="number">  46</span>  ALLEGRO_HAPTIC_GAIN         <span class="k3">=</span> <span class="n">1</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="n">14</span>,
<span class="number">  47</span>  ALLEGRO_HAPTIC_ANGLE        <span class="k3">=</span> <span class="n">1</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="n">15</span>,
<span class="number">  48</span>  ALLEGRO_HAPTIC_RADIUS       <span class="k3">=</span> <span class="n">1</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="n">16</span>,
<span class="number">  49</span>  ALLEGRO_HAPRIC_AZIMUTH      <span class="k3">=</span> <span class="n">1</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="n">17</span>,
<span class="number">  50</span><span class="k2">}</span><span class="k2">;</span>
<span class="number">  51</span>
<span class="number">  52</span>
<span class="number">  53</span>
<span class="number">  54</span><span class="c">/* Type: ALLEGRO_HAPTIC</span>
<span class="number">  55</span><span class="c"> */</span>
<span class="number">  56</span><span class="k1">typedef</span> <span class="k1">struct</span> ALLEGRO_HAPTIC ALLEGRO_HAPTIC<span class="k2">;</span>
<span class="number">  57</span>
<span class="number">  58</span><span class="c">/* Direction of a haptic effect. Angle is a value between 0 and 2*M_PI.</span>
<span class="number">  59</span><span class="c"> * An angle 0 means oriented towards the user, M_PI is away from the user</span>
<span class="number">  60</span><span class="c"> * (towards the screen). Angle is only supported if the device</span>
<span class="number">  61</span><span class="c">capabilities include</span>
<span class="number">  62</span><span class="c"> * ALLEGRO_HAPTIC_ANGLE.</span>
<span class="number">  63</span><span class="c"> * Radius (if supported ) is the distance of the effect from the user</span>
<span class="number">  64</span><span class="c"> * as a value between 0 and 1. Normally it is 0. Radius is only</span>
<span class="number">  65</span><span class="c">supported if the</span>
<span class="number">  66</span><span class="c"> * device capabilities include ALLEGRO_HAPTIC_RADIUS .</span>
<span class="number">  67</span><span class="c"> * Azimuth is the angle of elevation, between -M_PI and M_PI. 0 points to the</span>
<span class="number">  68</span><span class="c"> * horizontal plane, -M_PI points down, and M_PI points up.</span>
<span class="number">  69</span><span class="c"> * Azimuth is only supported if the device capabilities include</span>
<span class="number">  70</span><span class="c"> * ALLEGRO_HAPTIC_AZIMUTH.</span>
<span class="number">  71</span><span class="c"> *</span>
<span class="number">  72</span><span class="c"> */</span>
<span class="number">  73</span><span class="k1">struct</span> ALLEGRO_HAPTIC_DIRECTION <span class="k2">{</span>
<span class="number">  74</span>  <span class="k1">double</span> angle<span class="k2">;</span>
<span class="number">  75</span>  <span class="k1">double</span> radius<span class="k2">;</span>
<span class="number">  76</span>  <span class="k1">double</span> azimuth<span class="k2">;</span>
<span class="number">  77</span><span class="k2">}</span><span class="k2">;</span>
<span class="number">  78</span>
<span class="number">  79</span><span class="c">/* In all of the following structs, the doubles that express duration represent</span>
<span class="number">  80</span><span class="c"> * time in seconds. The double that represent levels of intensity are</span>
<span class="number">  81</span><span class="c">between 0.0</span>
<span class="number">  82</span><span class="c"> * and 1.0 that mean no effect and full 100% effect. */</span>
<span class="number">  83</span>
<span class="number">  84</span><span class="c">/* Delay to start the replay and duration of the replay, expressed  in</span>
<span class="number">  85</span><span class="c">seconds. */</span>
<span class="number">  86</span><span class="k1">struct</span> ALLEGRO_HAPTIC_REPLAY <span class="k2">{</span>
<span class="number">  87</span>    <span class="k1">double</span> length<span class="k2">;</span>
<span class="number">  88</span>    <span class="k1">double</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_128.html" target="_blank">delay</a><span class="k2">;</span>
<span class="number">  89</span><span class="k2">}</span><span class="k2">;</span>
<span class="number">  90</span>
<span class="number">  91</span><span class="c">/* Envelope of the effect. */</span>
<span class="number">  92</span><span class="k1">struct</span> ALLEGRO_HAPTIC_ENVELOPE <span class="k2">{</span>
<span class="number">  93</span>    <span class="k1">double</span> attack_length<span class="k2">;</span>
<span class="number">  94</span>    <span class="k1">double</span> attack_level<span class="k2">;</span>
<span class="number">  95</span>    <span class="k1">double</span> fade_length<span class="k2">;</span>
<span class="number">  96</span>    <span class="k1">double</span> fade_level<span class="k2">;</span>
<span class="number">  97</span><span class="k2">}</span><span class="k2">;</span>
<span class="number">  98</span>
<span class="number">  99</span><span class="c">/* Constant effect.  Level is between 0.0 and 1.0. */</span>
<span class="number"> 100</span><span class="k1">struct</span> ALLEGRO_HAPTIC_CONSTANT_EFFECT <span class="k2">{</span>
<span class="number"> 101</span>    <span class="k1">double</span> level<span class="k2">;</span>
<span class="number"> 102</span>    <span class="k1">struct</span> ALLEGRO_HAPTIC_ENVELOPE envelope<span class="k2">;</span>
<span class="number"> 103</span><span class="k2">}</span><span class="k2">;</span>
<span class="number"> 104</span>
<span class="number"> 105</span><span class="c">/* Ramp effect. Both start_level and end level are between 0.0 and 1.0.  */</span>
<span class="number"> 106</span><span class="k1">struct</span> ALLEGRO_HAPTIC_RAMP_EFFECT <span class="k2">{</span>
<span class="number"> 107</span>    <span class="k1">double</span> start_level<span class="k2">;</span>
<span class="number"> 108</span>    <span class="k1">double</span> end_level<span class="k2">;</span>
<span class="number"> 109</span>    <span class="k1">struct</span> ALLEGRO_HAPTIC_ENVELOPE envelope<span class="k2">;</span>
<span class="number"> 110</span><span class="k2">}</span><span class="k2">;</span>
<span class="number"> 111</span>
<span class="number"> 112</span><span class="c">/* Condition effect. */</span>
<span class="number"> 113</span><span class="k1">struct</span> ALLEGRO_HAPTIC_CONDITION_EFFECT <span class="k2">{</span>
<span class="number"> 114</span>    <span class="k1">double</span> right_saturation<span class="k2">;</span>
<span class="number"> 115</span>    <span class="k1">double</span> left_saturation<span class="k2">;</span>
<span class="number"> 116</span>    <span class="k1">double</span> right_coeff<span class="k2">;</span>
<span class="number"> 117</span>    <span class="k1">double</span> left_coeff<span class="k2">;</span>
<span class="number"> 118</span>    <span class="k1">double</span> deadband<span class="k2">;</span>
<span class="number"> 119</span>    <span class="k1">double</span> center<span class="k2">;</span>
<span class="number"> 120</span><span class="k2">}</span><span class="k2">;</span>
<span class="number"> 121</span>
<span class="number"> 122</span><span class="c">/* Periodic (wave) effect. */</span>
<span class="number"> 123</span><span class="k1">struct</span> ALLEGRO_HAPTIC_PERIODIC_EFFECT <span class="k2">{</span>
<span class="number"> 124</span>    <span class="k1">int</span> waveform<span class="k2">;</span>
<span class="number"> 125</span>    <span class="k1">double</span> period<span class="k2">;</span>
<span class="number"> 126</span>    <span class="k1">double</span> magnitude<span class="k2">;</span>
<span class="number"> 127</span>    <span class="k1">double</span> offset<span class="k2">;</span>
<span class="number"> 128</span>    <span class="k1">double</span> phase<span class="k2">;</span>
<span class="number"> 129</span>
<span class="number"> 130</span>    <span class="k1">struct</span> ALLEGRO_HAPTIC_ENVELOPE envelope<span class="k2">;</span>
<span class="number"> 131</span>    <span class="k1">int</span>    custom_len<span class="k2">;</span>
<span class="number"> 132</span>    <span class="k1">double</span> <span class="k3">*</span>custom_data<span class="k2">;</span>
<span class="number"> 133</span><span class="k2">}</span><span class="k2">;</span>
<span class="number"> 134</span>
<span class="number"> 135</span><span class="c">/* Simple rumble effect with a magnitude between 0.0 and 1.0 for both</span>
<span class="number"> 136</span><span class="c"> the strong and the weak rumble motors in the haptic device.  */</span>
<span class="number"> 137</span><span class="k1">struct</span> ALLEGRO_HAPTIC_RUMBLE_EFFECT <span class="k2">{</span>
<span class="number"> 138</span>    <span class="k1">double</span> strong_magnitude<span class="k2">;</span>
<span class="number"> 139</span>    <span class="k1">double</span> weak_magnitude<span class="k2">;</span>
<span class="number"> 140</span><span class="k2">}</span><span class="k2">;</span>
<span class="number"> 141</span>
<span class="number"> 142</span><span class="k1">union</span> ALLEGRO_HAPTIC_EFFECT_UNION <span class="k2">{</span>
<span class="number"> 143</span>    <span class="k1">struct</span> ALLEGRO_HAPTIC_CONSTANT_EFFECT   constant<span class="k2">;</span>
<span class="number"> 144</span>    <span class="k1">struct</span> ALLEGRO_HAPTIC_RAMP_EFFECT       ramp<span class="k2">;</span>
<span class="number"> 145</span>    <span class="k1">struct</span> ALLEGRO_HAPTIC_PERIODIC_EFFECT   periodic<span class="k2">;</span>
<span class="number"> 146</span>    <span class="k1">struct</span> ALLEGRO_HAPTIC_CONDITION_EFFECT  condition<span class="k2">;</span>
<span class="number"> 147</span>    <span class="k1">struct</span> ALLEGRO_HAPTIC_RUMBLE_EFFECT     rumble<span class="k2">;</span>
<span class="number"> 148</span><span class="k2">}</span><span class="k2">;</span>
<span class="number"> 149</span>
<span class="number"> 150</span><span class="c">/* Type: ALLEGRO_HAPTIC_EFFECT. This neeeds to be filled in and uploaded to</span>
<span class="number"> 151</span><span class="c"> * the haptic device before it can be played back.</span>
<span class="number"> 152</span><span class="c"> */</span>
<span class="number"> 153</span><span class="k1">struct</span> ALLEGRO_HAPTIC_EFFECT <span class="k2">{</span>
<span class="number"> 154</span>        <span class="k1">int</span>                                type<span class="k2">;</span>
<span class="number"> 155</span>        <span class="k1">int</span>                                id<span class="k2">;</span>
<span class="number"> 156</span>        <span class="k1">struct</span> ALLEGRO_HAPTIC_DIRECTION    direction<span class="k2">;</span>
<span class="number"> 157</span>        <span class="k1">struct</span> ALLEGRO_HAPTIC_REPLAY       replay<span class="k2">;</span>
<span class="number"> 158</span>        <span class="k1">union</span> ALLEGRO_HAPTIC_EFFECT_UNION  data<span class="k2">;</span>
<span class="number"> 159</span><span class="k2">}</span><span class="k2">;</span>
<span class="number"> 160</span>
<span class="number"> 161</span>
<span class="number"> 162</span><span class="c">/* Type: ALLEGRO_HAPTIC_EFFECT</span>
<span class="number"> 163</span><span class="c"> */</span>
<span class="number"> 164</span><span class="k1">typedef</span> <span class="k1">struct</span> ALLEGRO_HAPTIC_EFFECT ALLEGRO_HAPTIC_EFFECT<span class="k2">;</span>
<span class="number"> 165</span>
<span class="number"> 166</span>
<span class="number"> 167</span>
<span class="number"> 168</span><span class="c">/* Installs the haptic (force feedback) device subsystem. */</span>
<span class="number"> 169</span>AL_FUNC<span class="k2">(</span><span class="k1">bool</span>,             al_install_haptic          , <span class="k2">(</span><span class="k1">void</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 170</span><span class="c">/* Uninstalls the haptic device subsystem. */</span>
<span class="number"> 171</span>AL_FUNC<span class="k2">(</span><span class="k1">void</span>,             al_uninstall_haptic        , <span class="k2">(</span><span class="k1">void</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 172</span><span class="c">/* Returns true if the haptic device subsystem is installed, false if not. */</span>
<span class="number"> 173</span>AL_FUNC<span class="k2">(</span><span class="k1">bool</span>,             al_is_haptic_installed     , <span class="k2">(</span><span class="k1">void</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 174</span><span class="c">/* Checks if no new haptic devices became availabe and reconfigues the haptic</span>
<span class="number"> 175</span><span class="c"> *subsystem. */</span>
<span class="number"> 176</span>AL_FUNC<span class="k2">(</span><span class="k1">bool</span>,             al_reconfigure_haptic      , <span class="k2">(</span><span class="k1">void</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 177</span>
<span class="number"> 178</span><span class="c">/* Gets the amount of available haptic devices.*/</span>
<span class="number"> 179</span>AL_FUNC<span class="k2">(</span><span class="k1">int</span>,              al_get_num_haptics         , <span class="k2">(</span><span class="k1">void</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 180</span>
<span class="number"> 181</span><span class="c">/* Opens and initializes the haptic device and returns a pointer</span>
<span class="number"> 182</span><span class="c"> * to a device handle, or NULL on error.  */</span>
<span class="number"> 183</span>AL_FUNC<span class="k2">(</span>ALLEGRO_HAPTIC <span class="k3">*</span>, al_get_haptic             , <span class="k2">(</span><span class="k1">int</span> hapticn<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 184</span><span class="c">/* Closes the haptic device. */</span>
<span class="number"> 185</span>AL_FUNC<span class="k2">(</span><span class="k1">void</span>,             al_release_haptic          , <span class="k2">(</span>ALLEGRO_HAPTIC <span class="k3">*</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 186</span><span class="c">/* Returns true if the haptic device can currently be used, false if not.*/</span>
<span class="number"> 187</span>AL_FUNC<span class="k2">(</span><span class="k1">bool</span>,             al_get_haptic_active       , <span class="k2">(</span>ALLEGRO_HAPTIC <span class="k3">*</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 188</span><span class="c">/* Gets a string that describes the name of the haptic device.*/</span>
<span class="number"> 189</span>AL_FUNC<span class="k2">(</span><span class="k1">const</span> <span class="k1">char</span><span class="k3">*</span>,      al_get_haptic_name         , <span class="k2">(</span>ALLEGRO_HAPTIC <span class="k3">*</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 190</span>
<span class="number"> 191</span><span class="c">/* Returns an integer with or'ed values from ALLEGRO_HAPTIC_CONSTANTS, that if</span>
<span class="number"> 192</span><span class="c"> set indicate that the haptic device supports the given feature. */</span>
<span class="number"> 193</span>AL_FUNC<span class="k2">(</span><span class="k1">int</span>,              al_get_haptic_capabilities , <span class="k2">(</span>ALLEGRO_HAPTIC <span class="k3">*</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 194</span>
<span class="number"> 195</span><span class="c">/* Sets the gain of the haptic device if supported. Gain is much like</span>
<span class="number"> 196</span><span class="c">volume for sound,</span>
<span class="number"> 197</span><span class="c"> it is as if every effect's intensity is multiplied by it. Gain is a</span>
<span class="number"> 198</span><span class="c">value between</span>
<span class="number"> 199</span><span class="c"> 0.0 and 1.0. Returns true if set sucessfully, false if not.*/</span>
<span class="number"> 200</span>AL_FUNC<span class="k2">(</span><span class="k1">bool</span>,             al_set_haptic_gain         , <span class="k2">(</span>ALLEGRO_HAPTIC
<span class="number"> 201</span><span class="k3">*</span>, <span class="k1">double</span> gain<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 202</span><span class="c">/* Returns the current gain of the device. */</span>
<span class="number"> 203</span>AL_FUNC<span class="k2">(</span><span class="k1">double</span>,           al_get_haptic_gain         , <span class="k2">(</span>ALLEGRO_HAPTIC <span class="k3">*</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 204</span>
<span class="number"> 205</span><span class="c">/* Returns true if the mouse has haptic capabilities, false if not.*/</span>
<span class="number"> 206</span>AL_FUNC<span class="k2">(</span><span class="k1">bool</span>,             al_is_mouse_haptic         , <span class="k2">(</span>ALLEGRO_MOUSE <span class="k3">*</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 207</span>
<span class="number"> 208</span><span class="c">/* Returns true if the joystick has haptic capabilities, false if not.*/</span>
<span class="number"> 209</span>AL_FUNC<span class="k2">(</span><span class="k1">bool</span>,             al_is_joystick_haptic      , <span class="k2">(</span><a href="http://www.allegro.cc/manual/ALLEGRO_JOYSTICK"><span class="a">ALLEGRO_JOYSTICK</span></a> <span class="k3">*</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 210</span><span class="c">/* If the mouse has haptic capabilities, returns the associated haptic</span>
<span class="number"> 211</span><span class="c">device handle.</span>
<span class="number"> 212</span><span class="c"> * Otherwise returns NULL;*/</span>
<span class="number"> 213</span>AL_FUNC<span class="k2">(</span>ALLEGRO_HAPTIC <span class="k3">*</span>, al_get_haptic_from_mouse   , <span class="k2">(</span>ALLEGRO_MOUSE <span class="k3">*</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 214</span><span class="c">/* If the mouse has haptic capabilities, returns the associated haptic</span>
<span class="number"> 215</span><span class="c">device handle.</span>
<span class="number"> 216</span><span class="c"> * Otherwise returns NULL;*/</span>
<span class="number"> 217</span>AL_FUNC<span class="k2">(</span>ALLEGRO_HAPTIC <span class="k3">*</span>, al_get_haptic_from_joystick, <span class="k2">(</span><a href="http://www.allegro.cc/manual/ALLEGRO_JOYSTICK"><span class="a">ALLEGRO_JOYSTICK</span></a> <span class="k3">*</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 218</span>
<span class="number"> 219</span><span class="c">/* Returns the maximum amount of haptic effects that can be uploaded</span>
<span class="number"> 220</span><span class="c">to the device. */</span>
<span class="number"> 221</span>AL_FUNC<span class="k2">(</span><span class="k1">int</span>,              al_get_num_haptic_effects  , <span class="k2">(</span>ALLEGRO_HAPTIC <span class="k3">*</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 222</span>
<span class="number"> 223</span><span class="c">/* Returns true if the haptic device can play the haptic effect as</span>
<span class="number"> 224</span><span class="c">given, false if not. */</span>
<span class="number"> 225</span>AL_FUNC<span class="k2">(</span><span class="k1">bool</span>,             al_is_haptic_effect_ok     , <span class="k2">(</span>ALLEGRO_HAPTIC
<span class="number"> 226</span><span class="k3">*</span>, ALLEGRO_HAPTIC_EFFECT <span class="k3">*</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 227</span>
<span class="number"> 228</span><span class="c">/* Uploads the haptic effect to the device. In play_id, an integer is</span>
<span class="number"> 229</span><span class="c">stored that is</span>
<span class="number"> 230</span><span class="c"> a reference to be used to control playback of the effect.*/</span>
<span class="number"> 231</span>AL_FUNC<span class="k2">(</span><span class="k1">bool</span>,             al_upload_haptic_effect    , <span class="k2">(</span>ALLEGRO_HAPTIC
<span class="number"> 232</span><span class="k3">*</span>, ALLEGRO_HAPTIC_EFFECT <span class="k3">*</span>, <span class="k1">int</span> <span class="k3">*</span> play_id<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 233</span>
<span class="number"> 234</span><span class="c">/* Plays back a previously uploaded haptic effect on this device. */</span>
<span class="number"> 235</span>AL_FUNC<span class="k2">(</span><span class="k1">bool</span>,             al_play_haptic_effect      , <span class="k2">(</span>ALLEGRO_HAPTIC
<span class="number"> 236</span><span class="k3">*</span>, <span class="k1">int</span> play_id, <span class="k1">int</span> loop<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 237</span>
<span class="number"> 238</span><span class="c">/* Stops playing a haptic effect on this device. */</span>
<span class="number"> 239</span>AL_FUNC<span class="k2">(</span><span class="k1">bool</span>,             al_stop_haptic_effect      , <span class="k2">(</span>ALLEGRO_HAPTIC
<span class="number"> 240</span><span class="k3">*</span>, <span class="k1">int</span> play_id<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 241</span><span class="c">/* Stops playing all haptic effects on this device. */</span>
<span class="number"> 242</span>AL_FUNC<span class="k2">(</span><span class="k1">bool</span>,             al_stop_all_haptic_effects , <span class="k2">(</span>ALLEGRO_HAPTIC
<span class="number"> 243</span><span class="k3">*</span>, <span class="k1">int</span> play_id<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 244</span>
<span class="number"> 245</span><span class="c">/* Returns true if the haptic effect is playing on the device false if</span>
<span class="number"> 246</span><span class="c">not or if stopped. */</span>
<span class="number"> 247</span>AL_FUNC<span class="k2">(</span><span class="k1">bool</span>,             al_is_haptic_effect_playing, <span class="k2">(</span>ALLEGRO_HAPTIC
<span class="number"> 248</span><span class="k3">*</span>, <span class="k1">int</span> play_id<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 249</span>
<span class="number"> 250</span><span class="c">/* Uploads a simple rumble effect to the haptic device and starts</span>
<span class="number"> 251</span><span class="c">playback immediately.</span>
<span class="number"> 252</span><span class="c"> */</span>
<span class="number"> 253</span>AL_FUNC<span class="k2">(</span><span class="k1">bool</span>,             al_rumble_haptic           , <span class="k2">(</span>ALLEGRO_HAPTIC
<span class="number"> 254</span><span class="k3">*</span>, <span class="k1">double</span> intensity, <span class="k1">double</span> duration, <span class="k1">int</span> <span class="k3">*</span> play_id<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 255</span>
<span class="number"> 256</span><span class="c">/* Event source for haptic device events.</span>
<span class="number"> 257</span><span class="c"> *(XXX: currently no events are planned to be emitted, but that may change. )*/</span>
<span class="number"> 258</span>AL_FUNC<span class="k2">(</span><a href="http://www.allegro.cc/manual/ALLEGRO_EVENT_SOURCE"><span class="a">ALLEGRO_EVENT_SOURCE</span></a> <span class="k3">*</span>, al_get_haptic_event_source, <span class="k2">(</span><span class="k1">void</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 259</span>
<span class="number"> 260</span>
<span class="number"> 261</span>
<span class="number"> 262</span>
<span class="number"> 263</span><span class="p">#ifdef __cplusplus</span>
<span class="number"> 264</span><span class="k2">}</span>
<span class="number"> 265</span><span class="p">#endif</span>
<span class="number"> 266</span>
<span class="number"> 267</span><span class="p">#endif</span>
</div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (beoran)</author>
		<pubDate>Sat, 08 Jun 2013 23:40:45 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>One &quot;danger&quot; with these things is always that you write for one platform and then other platforms do things completely differently. You end up with a &quot;biased&quot; api. If you haven&#39;t already, I think you should look at Windows and Mac OS X and see how things are done there (even if you can&#39;t write drivers for those.) Then find a common set of functions and an API that is not targetted at a single platform.</p><p>NOTE: You may have already done this. I see a lot of very specific information here and that made me wonder if this wasn&#39;t just a thin wrapper over Linux apis.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Trent Gamblin)</author>
		<pubDate>Sat, 08 Jun 2013 23:46:17 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Actually I&#39;m guilty as charged there. <img src="http://www.allegro.cc/forums/smileys/sad.gif" alt=":(" /> </p><p>I don&#39;t have access to windows or mac OS-X, so to get some ideas of who to structure the API, I had to take a look at the SDL 2 sources (which are under the same license as Allegro, so no problem there). They too use a Linux-ish API as the smallest common denominator for most platforms . So I went for that with some nuances, such as using doubles to get device independent value for time , and relative values for intensity in there. </p><p>But I also know from SDL2 that it&#39;s possible to fit Windows and OS-X into this Linux-ish API, so I thought it would be OK. But if you have better ideas, then please do make suggestions. </p><p>I&#39;ll probably only be able to supply a Linux driver anyway, so I&#39;d love to hear from people who want to implement te Windows or OS-X, or Iphone, or Android drivers for this and I&#39;d like those people to tell me how we could modify this proposal so it will make it easy for them to write their drivers.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (beoran)</author>
		<pubDate>Sun, 09 Jun 2013 00:01:15 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/612754/984676#target">beoran</a> said:</div><div class="quote"><p>
But I also know from SDL2 that it&#39;s possible to fit Windows and OS-X into this Linux-ish API, so I thought it would be OK.
</p></div></div><p>

If that&#39;s the case then it&#39;s probably OK. BTW, you don&#39;t need a computer running Windows or OS X to look at the APIs. MSDN and <a href="http://developer.apple.com">http://developer.apple.com</a> have documentation online.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Trent Gamblin)</author>
		<pubDate>Sun, 09 Jun 2013 00:04:08 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Well yes, but I don&#39; t use SDL exactly because I like the Allegro API better, so their API doesn&#39;t have to be the end-all be-all. If possible I&#39;d like an API that is easier to use than SDL.</p><p>It&#39;s true, I should RTFM, but since I don&#39;t have a chance to test the other platforms, I doubt I would learn much more from RTFM than from the SDL code.  I&#39;d rather listen to the opinion of people who had hands on experience with those API&#39;s. Or people who are willing to gain this experience. </p><p>To be blunt, Trent, would you be willing to do the Windows or OSX port of this? You can get a USB joystick that supports rumble cheaply and easily enough, and then you can try to make it work using the Windows or OSX API. Like that you&#39;ll get valuable hands-on experience and we&#39;ll be able to decide how too proceed with ALLEGRO_HAPTICS much better.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (beoran)</author>
		<pubDate>Sun, 09 Jun 2013 00:12:47 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I can do Windows and OS X, but I may not have a lot of time to invest in them. I&#39;ll do my best. I guess I&#39;ll have a look on MSDN first and see what&#39;s available.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Trent Gamblin)</author>
		<pubDate>Sun, 09 Jun 2013 00:16:26 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Thanks a lot! I know you are busy with your game project, but I think for an action RPG, rumble effects certainly will be an extra selling point. Even if you can&#39;t write the whole driver, your explorations will hopefully shed some light on the right approach. </p><p>I&#39;ll share with you the whole patch of all other changes I made versus Allegro git so far while I was working on the Linux driver, if and when you need it, so feel free to request it whenever.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (beoran)</author>
		<pubDate>Sun, 09 Jun 2013 00:21:52 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Branches are cheap in git right? Is there any reason we can&#39;t create a branch for developing this (to anyone who knows)?</p><p>beoran, these two pages hold most of the key information on force feedback with DirectInput:</p><p><a href="http://msdn.microsoft.com/en-us/library/windows/desktop/microsoft.directx_sdk.idirectinputdevice8.idirectinputdevice8.createeffect(v=vs.85).aspx">http://msdn.microsoft.com/en-us/library/windows/desktop/microsoft.directx_sdk.idirectinputdevice8.idirectinputdevice8.createeffect(v=vs.85).aspx</a><br /><a href="http://msdn.microsoft.com/en-us/library/windows/desktop/microsoft.directx_sdk.idirectinputeffect.idirectinputeffect.setparameters(v=vs.85).aspx">http://msdn.microsoft.com/en-us/library/windows/desktop/microsoft.directx_sdk.idirectinputeffect.idirectinputeffect.setparameters(v=vs.85).aspx</a></p><p>Maybe you can tell me what out of this is common between your header and this. We can then try and make something that works well with stuff in common from them. For things that are in one but not the other, we can optionally drop them or keep them with fallbacks to something close where not supported.</p><p>EDIT2: After reading over your API fully and comparing it to DirectInput, it&#39;s mostly the same. I think there are a few types of effect that are missing in DirectInput and I didn&#39;t see anything about replays (if there is no replay in DirectInput I think we could put the onus on the user to replay effects, I&#39;m not sure about this though.)</p><p>One thing I think that should be done is to somehow merge this with the joystick (and mouse?) apis somewhat. Like perhaps we could have a function like ALLEGRO_JOYSTICK *al_get_haptic_joystick and maybe the reverse.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Trent Gamblin)</author>
		<pubDate>Sun, 09 Jun 2013 00:23:17 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>OK, I&#39;ll set up my allegro branch at github for this, it might be tomorrow or Monday though before I get this done.</p><p>I quicly read the info linked too and it seems Directinput supports a few effects that Linux doesn&#39;t, and generally formats it&#39;s parameters differently, and is somewhat more convoluted. Especially when it comes to the position of the effect. Linux only supports an angle, (or 2 carthesian axes for a condition effect, IIRC), but DI supports much more. My idea was to only support spherical coordinates , and let the divers translate those as needed. </p><p>The Directinput API does allow on to upload, play and stop a sample, but it doesn&#39;t give you a &quot;play id&quot; like Linux does, you have to use the effect object, which means you can&#39;t reuse the object for different replays. This means that it may be easier to implement the API if we drop the play id and always use an ALLEGRO_HAPTIC_EFFECT * to control playback and stopping: </p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">  1</span><span class="c">/* Uploads the haptic effect to the device. */</span>
<span class="number">  2</span>AL_FUNC<span class="k2">(</span><span class="k1">bool</span>,             al_upload_haptic_effect    , <span class="k2">(</span>ALLEGRO_HAPTIC<span class="k3">*</span>, ALLEGRO_HAPTIC_EFFECT <span class="k3">*</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  3</span>
<span class="number">  4</span><span class="c">/* Plays back a previously uploaded haptic effect on this device. </span>
<span class="number">  5</span><span class="c">If the effect want uploaded yet, this will automaticallly call al_upload_haptic_effect to try and upload the effect.</span>
<span class="number">  6</span><span class="c">*/</span> 
<span class="number">  7</span>AL_FUNC<span class="k2">(</span><span class="k1">bool</span>,             al_play_haptic_effect      , <span class="k2">(</span>ALLEGRO_HAPTIC<span class="k3">*</span>, ALLEGRO_HAPTIC_EFFECT <span class="k3">*</span> effect, <span class="k1">int</span> loop<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  8</span>
<span class="number">  9</span><span class="c">/* Stops playing all haptic effects on this device. */</span>
<span class="number"> 10</span>AL_FUNC<span class="k2">(</span><span class="k1">bool</span>,             al_stop_all_haptic_effects , <span class="k2">(</span>ALLEGRO_HAPTIC
<span class="number"> 11</span><span class="k3">*</span>,  ALLEGRO_HAPTIC_EFFECT <span class="k3">*</span> effect<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 12</span>
<span class="number"> 13</span><span class="c">/* Returns true if the haptic effect is playing on the device false if</span>
<span class="number"> 14</span><span class="c">not or if stopped. */</span>
<span class="number"> 15</span>AL_FUNC<span class="k2">(</span><span class="k1">bool</span>,             al_is_haptic_effect_playing, <span class="k2">(</span>ALLEGRO_HAPTIC
<span class="number"> 16</span><span class="k3">*</span>, ALLEGRO_HAPTIC_EFFECT <span class="k3">*</span> effect<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 17</span>
<span class="number"> 18</span><span class="c">/* Fills in the haptic effect with a a simple rumble effect, uploads it to the  haptic device and starts playback immediately.</span>
<span class="number"> 19</span><span class="c"> */</span>
<span class="number"> 20</span>AL_FUNC<span class="k2">(</span><span class="k1">bool</span>,             al_rumble_haptic           , <span class="k2">(</span>ALLEGRO_HAPTIC
<span class="number"> 21</span><span class="k3">*</span>,  ALLEGRO_HAPTIC_EFFECT <span class="k3">*</span> effect, <span class="k1">double</span> intensity, <span class="k1">double</span> duration, <span class="k2">)</span><span class="k2">;</span>
<span class="number"> 22</span>
<span class="number"> 23</span><span class="c">/* Copies a haptic effectin such a way that dest can be uploaded, played, and stoppped independently from src. */</span>
<span class="number"> 24</span>AL_FUNC<span class="k2">(</span><span class="k1">bool</span>, al_copy_haptic_effect<span class="k2">(</span>ALLEGRO_HAPTIC_EFFECT <span class="k3">*</span> dest, ALLEGRO_HAPTIC_EFFECT <span class="k3">*</span> src<span class="k2">)</span><span class="k2">;</span>
</div></div><p>

What you say? <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (beoran)</author>
		<pubDate>Sun, 09 Jun 2013 01:49:20 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Looks ok. DirectInput doesn&#39;t have a &quot;rumble&quot; haptic, which one do you think is closest?</p><p>(probably just an oversight but does this need the effect parameter? AL_FUNC(bool,             al_stop_all_haptic_effects , (ALLEGRO_HAPTIC<br /> 11*,  ALLEGRO_HAPTIC_EFFECT * effect));)
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Trent Gamblin)</author>
		<pubDate>Sun, 09 Jun 2013 01:54:36 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Rumble is just a very simple &quot;rumble&quot; effect, normally you replace this by a periodic sine wave (or other supported wave) of the required amplitude. Actually, Linux supports rumble because the driver does an internal translation for you. I still want to have a &quot;rumble&quot; for the simples use case where all you want is a bit of vibration in the joystick. </p><p>Oh, and for integrating ALLEGRO_HAPTIC devices with joystick and mouse, I think <br />al_get_haptic_from_mouse and al_get_haptic_from_joystick should be enough for now. Normally I&#39;d imagine you first install the joysticks and then enable the haptic effects on them. We could probably put that in the docs too and perhaps even require this, although I still haven&#39;t figured out yet how to make this work with the pluggable joysticks feature.</p><p>And yes, that was an oversight. The proper signature is of course <br />AL_FUNC(bool, al_stop_all_haptic_effects , (ALLEGRO_HAPTIC *));
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (beoran)</author>
		<pubDate>Sun, 09 Jun 2013 02:05:03 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I think the ALLEGRO_HAPTIC for any joystick should behave exactly like the ALLEGRO_JOYSTICKs. If it&#39;s unplugged or one is plugged in the current state remains valid. Those devices become usable/unusable once you call al_reconfigure_joysticks. I guess with mice or other devices we just not support hotplugging at least at this time.</p><p>And I agree that having a simple &quot;rumble&quot; effect is a good idea.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Trent Gamblin)</author>
		<pubDate>Sun, 09 Jun 2013 02:10:07 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Yes, I see the point about al_reconfigure_joysticks. Perhhaps that&#39;s what al_reconfigure_haptics will do on the side of the haptic devices then? </p><p>Oh, and it went easier than I thought, I set up a copy of the Allegro development branch on Github. You need the &quot;haptics&quot; branch specifically, get it here: </p><p><a href="https://github.com/beoran/allegro/tree/haptic">https://github.com/beoran/allegro/tree/haptic</a></p><p>Ah git... It&#39;s sometimes a bit difficult to use, but in functionality, it&#39;s &quot;king&quot;!
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (beoran)</author>
		<pubDate>Sun, 09 Jun 2013 02:28:18 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Depends. Besides gamepads, what other haptic devices are there that will be supported? DirectInput only supports haptics on gamepads. On Linux we could do something like we do for joysticks already, but I don&#39;t know if hot pluggable haptic devices are as important as joysticks. Do other haptic devices on Linux get /dev/input/js* devices or something else? If so they&#39;d probably be treated like joysticks with no buttons or whatever, and al_reconfigure_joysticks would take care of them automatically.</p><p>Checking out the code now.</p><p>EDIT: Couldn&#39;t complete the checkout. Got this error:</p><p>warning: remote HEAD refers to nonexistent ref, unable to checkout.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Trent Gamblin)</author>
		<pubDate>Sun, 09 Jun 2013 02:31:58 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>In linux, any input device can have haptic capabilities. So it&#39;s not linked to /dev/input/js0 at all, really. At least in theory, linux can have haptic keyboards, haptic trackerballs, haptic mise, haptic tablets, haptic touch screens, etc. </p><p>Another reason why haptic devices may not be integrated in joystics is on mobile platforms. Iphones and android can vibrate the whole phone, which isn&#39;t connected to the input. I though this should probably be modeled in Allegro as a haptic device too.</p><p>And the code isn&#39;t in compiling state, sorry for that. I just blasted it there quickly so we could &quot;git&quot; going. :p</p><p>Edit: to solve your git problem, after clning the repository, go into the seemingly empty cloned allegro subdir and do </p><p>git checkout 653125e2e3c80953d153c0a3f34326e940e8cadc<br />git checkout -b haptic</p><p>To get the repository in working state.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (beoran)</author>
		<pubDate>Sun, 09 Jun 2013 02:37:12 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p><s>Ok, but the error is from git. I can&#39;t clone the repository.</s>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Trent Gamblin)</author>
		<pubDate>Sun, 09 Jun 2013 02:43:07 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I tested it, if you do git clone and then get that message, you should find a seemingly empty allegro directory. That means the cloning actually worked, just the checkout didn&#39;t. </p><p>Necause git&#39;s not able to find the right branch (it expects master but that doesn&#39;t exist), it checks out nothing and leaves the allegro directory seemingly empty.  So you must manually check out the latest revision and tell it that is the haptic branch.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (beoran)</author>
		<pubDate>Sun, 09 Jun 2013 02:46:59 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>(I only looked at this briefly so far)</p><p>You provide a filled-in effect structure to al_upload_haptic_effect, but then you must provide the same address to al_play_haptic_effect? I think the previous design was cleaner, where the ALLEGRO_HAPTIC object owns the effect after uploading, and returns a handle for you to work with.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Peter Wang)</author>
		<pubDate>Sun, 09 Jun 2013 06:28:38 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Yeah that makes sense to me. I just couldn&#39;t articulate it.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Trent Gamblin)</author>
		<pubDate>Sun, 09 Jun 2013 06:44:04 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/612754/984700#target">beoran</a> said:</div><div class="quote"><p>Iphones and android can vibrate the whole phone, which isn&#39;t connected to the input. I though this should probably be modeled in Allegro as a haptic device too.</p></div></div><p>
I agree.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Gideon Weems)</author>
		<pubDate>Sun, 09 Jun 2013 08:22:25 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>OK, I&#39;ll reinstate the int handle based API. Or should I use a ALLEGRO_HAPTIC_PLAYBACK * , a bit like the sound API?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (beoran)</author>
		<pubDate>Sun, 09 Jun 2013 10:22:11 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Maybe ALLEGRO_HAPTIC_EFFECT_ID (not a pointer) if we were to match the audio API.</p><p>Do we need the stuff to enumerate/reconfigure/get/release individual ALLEGRO_HAPTIC objects? I&#39;m assuming that haptic devices could be a component of some other objects, mainly ALLEGRO_JOYSTICK. For vibrating the whole phone, we might use the ALLEGRO_DISPLAY as the parent (or introduce something different). This might simplify the API a bit.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Peter Wang)</author>
		<pubDate>Sun, 09 Jun 2013 10:50:54 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I&#39;ll take another look at the audio API and try to see how I can match that best with an ALLEGRO_HAPTIC_EFFECT_ID. </p><p>As for simplifying the API, unfortunately, some haptic devices are not connected to another device such as a display, screen or a joystick. Think of the PS2 Rez &quot;Trance Vibrator&quot; or other similar haptic devices. We have to think of everything...
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (beoran)</author>
		<pubDate>Sun, 09 Jun 2013 14:56:04 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>We have joy sticks.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Peter Wang)</author>
		<pubDate>Sun, 09 Jun 2013 16:31:48 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Ah yes, joy sticks like these ones too: <br /><a href="http://therionorteline.files.wordpress.com/2012/09/usb-vibrator.jpg?w=1092">http://therionorteline.files.wordpress.com/2012/09/usb-vibrator.jpg?w=1092</a><br /><img src="http://www.allegro.cc/forums/smileys/wink.gif" alt=";)" /></p><p>True, we could model such a no-input haptic device as a joystick (that does not return events), but I feel that that doesn&#39;t make much sense now if that makes sense. Also mice and keyboards can be haptic as well.</p><p>However, perhaps a few joystick wrapper functions could be useful, like say<br />al_joystick_upload_haptic_effect, al_joystick_upload_play_effect, etc?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (beoran)</author>
		<pubDate>Sun, 09 Jun 2013 19:26:21 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Jokes aside, al_get_joystick_num_sticks/axes/buttons can return zero as well, once we update the documentation. How many zero-input devices are there anyway? (not counting gimmicks which only draw power from the USB port) I assume the Rez trance vibrator, specifically, is just another game controller to the OS.</p><p>Haptic keyboard/mouse can be handled as you had already.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Peter Wang)</author>
		<pubDate>Mon, 10 Jun 2013 07:12:57 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Well, I can&#39;t say for all operating systems, but the Rez presents itself to Linux in the driver I know of as a device separate from the input, with a separate API. This may be a reason, though to disregard it for now.</p><p>However, I have to admit that for all other haptic devices I know of on Linux, the haptic capabilities are a part of the properties of a generic input device. Also, it&#39;s probably true that it will be easier for the people who use the API if they can get the haptic device handle directly from the desired device. So, I&#39;ll follow your suggestion. </p><p>I&#39;ll change the proposed API so haptic capabilities will be linked to existing input devices. And for the rare case of a haptic device that has no input capabilities, we&#39;ll make a virtual joystick that has no axes, or perhaps a al_joystic_is_pure_haptic(). Also this makes it possible to link the coordinate system of the haptic device to the axes the joystick actually has. It does mean that we have to modify the Linux joystick driver to scan more than just /dev/input/js* to get the &quot;virtual joysticks&quot;. </p><p>So the way to get a haptic device handle will then be the following:
</p><div class="source-code snippet"><div class="inner"><pre>ALLEGRO_HAPTIC <span class="k3">*</span> al_get_haptic_from_joystick<span class="k2">(</span><a href="http://www.allegro.cc/manual/ALLEGRO_JOYSTICK"><span class="a">ALLEGRO_JOYSTICK</span></a> <span class="k3">*</span><span class="k2">)</span><span class="k2">;</span>
ALLEGRO_HAPTIC <span class="k3">*</span> al_get_haptic_from_keyboard<span class="k2">(</span>ALLEGRO_KEYBOARD <span class="k3">*</span><span class="k2">)</span><span class="k2">;</span>
ALLEGRO_HAPTIC <span class="k3">*</span> al_get_haptic_from_display<span class="k2">(</span><a href="http://www.allegro.cc/manual/ALLEGRO_DISPLAY"><span class="a">ALLEGRO_DISPLAY</span></a> <span class="k3">*</span><span class="k2">)</span><span class="k2">;</span>
ALLEGRO_HAPTIC <span class="k3">*</span> al_get_haptic_from_mouse<span class="k2">(</span>ALLEGRO_MOUSE <span class="k3">*</span><span class="k2">)</span><span class="k2">;</span>
ALLEGRO_HAPTIC <span class="k3">*</span> al_get_haptic_from_touch_input<span class="k2">(</span>ALLEGRO_TOUCH_INPUT <span class="k3">*</span><span class="k2">)</span><span class="k2">;</span>
</pre></div></div><p>

Hmm, almost makes me wish we had some kind of generic ALLEGRO_INPUT_DEVICE...   </p><p>Edit: here is the adjusted proposal for haptic.h, also with ALLEGRO_HAPTIC_EFFECT_ID to simplify play and stop. </p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">   1</span><span class="c">/*         ______   ___    ___</span>
<span class="number">   2</span><span class="c"> *        /\  _  \ /_ \  /_ \</span>
<span class="number">   3</span><span class="c"> *        \ \ \L\ \//\ \ //\ \      __     __   _ __   ___</span>
<span class="number">   4</span><span class="c"> *         \ \  __ \ \ \ \  \ \ \   /'__`\ /'_ `/`'__/ __`\</span>
<span class="number">   5</span><span class="c"> *          \ \ /\ \ _\ _ _\ _/\  __//\ \L\ \ \ //\ \L\ \</span>
<span class="number">   6</span><span class="c"> *           \ _\ _/____/____\ ____\ ____ \ _\\ ____/</span>
<span class="number">   7</span><span class="c"> *            /_//_//____//____//____//___L\ /_/ /___/</span>
<span class="number">   8</span><span class="c"> *                                           /____/</span>
<span class="number">   9</span><span class="c"> *                                           _/__/</span>
<span class="number">  10</span><span class="c"> *</span>
<span class="number">  11</span><span class="c"> *      Haptic (that is, force feedback) routines for Allegro. </span>
<span class="number">  12</span><span class="c"> *      By Beoran (beoran@gmail.com), 2013.</span>
<span class="number">  13</span><span class="c"> *</span>
<span class="number">  14</span><span class="c"> *      See readme.txt for copyright information.</span>
<span class="number">  15</span><span class="c"> */</span>
<span class="number">  16</span>
<span class="number">  17</span><span class="p">#ifndef __al_included_allegro5_haptic_h</span>
<span class="number">  18</span><span class="p">#define __al_included_allegro5_haptic_h</span>
<span class="number">  19</span>
<span class="number">  20</span><span class="p">#include "allegro5/base.h"</span>
<span class="number">  21</span><span class="p">#include "allegro5/events.h"</span>
<span class="number">  22</span><span class="p">#include "allegro5/mouse.h"</span>
<span class="number">  23</span><span class="p">#include "allegro5/joystick.h"</span>
<span class="number">  24</span>
<span class="number">  25</span><span class="p">#ifdef __cplusplus</span>
<span class="number">  26</span>   <span class="k1">extern</span> <span class="s">"C"</span> <span class="k2">{</span>
<span class="number">  27</span><span class="p">#endif</span>
<span class="number">  28</span>
<span class="number">  29</span><span class="c">/* Enum: ALLEGRO_HAPTIC_CONSTANTS</span>
<span class="number">  30</span><span class="c"> */</span>
<span class="number">  31</span><span class="k1">enum</span> ALLEGRO_HAPTIC_CONSTANTS <span class="k2">{</span> 
<span class="number">  32</span>  ALLEGRO_HAPTIC_RUMBLE       <span class="k3">=</span> <span class="n">1</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="n">0</span>,
<span class="number">  33</span>  ALLEGRO_HAPTIC_PERIODIC     <span class="k3">=</span> <span class="n">1</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="n">1</span>,
<span class="number">  34</span>  ALLEGRO_HAPTIC_CONSTANT     <span class="k3">=</span> <span class="n">1</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="n">2</span>,
<span class="number">  35</span>  ALLEGRO_HAPTIC_SPRING       <span class="k3">=</span> <span class="n">1</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="n">3</span>,
<span class="number">  36</span>  ALLEGRO_HAPTIC_FRICTION     <span class="k3">=</span> <span class="n">1</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="n">4</span>,
<span class="number">  37</span>  ALLEGRO_HAPTIC_DAMPER       <span class="k3">=</span> <span class="n">1</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="n">5</span>,
<span class="number">  38</span>  ALLEGRO_HAPTIC_INERTIA      <span class="k3">=</span> <span class="n">1</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="n">6</span>,
<span class="number">  39</span>  ALLEGRO_HAPTIC_RAMP         <span class="k3">=</span> <span class="n">1</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="n">7</span>,
<span class="number">  40</span>  ALLEGRO_HAPTIC_SQUARE       <span class="k3">=</span> <span class="n">1</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="n">8</span>,
<span class="number">  41</span>  ALLEGRO_HAPTIC_TRIANGLE     <span class="k3">=</span> <span class="n">1</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="n">9</span>,
<span class="number">  42</span>  ALLEGRO_HAPTIC_SINE         <span class="k3">=</span> <span class="n">1</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="n">10</span>,
<span class="number">  43</span>  ALLEGRO_HAPTIC_SAW_UP       <span class="k3">=</span> <span class="n">1</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="n">11</span>,
<span class="number">  44</span>  ALLEGRO_HAPTIC_SAW_DOWN     <span class="k3">=</span> <span class="n">1</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="n">12</span>,
<span class="number">  45</span>  ALLEGRO_HAPTIC_CUSTOM       <span class="k3">=</span> <span class="n">1</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="n">13</span>,  
<span class="number">  46</span>  ALLEGRO_HAPTIC_GAIN         <span class="k3">=</span> <span class="n">1</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="n">14</span>,   
<span class="number">  47</span>  ALLEGRO_HAPTIC_ANGLE        <span class="k3">=</span> <span class="n">1</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="n">15</span>,
<span class="number">  48</span>  ALLEGRO_HAPTIC_RADIUS       <span class="k3">=</span> <span class="n">1</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="n">16</span>,
<span class="number">  49</span>  ALLEGRO_HAPRIC_AZIMUTH      <span class="k3">=</span> <span class="n">1</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="n">17</span>,
<span class="number">  50</span><span class="k2">}</span><span class="k2">;</span>
<span class="number">  51</span>
<span class="number">  52</span>
<span class="number">  53</span>
<span class="number">  54</span><span class="c">/* Type: ALLEGRO_HAPTIC</span>
<span class="number">  55</span><span class="c"> */</span>
<span class="number">  56</span><span class="k1">typedef</span> <span class="k1">struct</span> ALLEGRO_HAPTIC ALLEGRO_HAPTIC<span class="k2">;</span>
<span class="number">  57</span>
<span class="number">  58</span><span class="c">/* Direction of a haptic effect. Angle is a value between 0 and 2*M_PI.</span>
<span class="number">  59</span><span class="c"> * An angle 0 means oriented towards the user, M_PI is away from the user </span>
<span class="number">  60</span><span class="c"> * (towards the screen). Angle is only supported if the device capabilities include</span>
<span class="number">  61</span><span class="c"> * ALLEGRO_HAPTIC_ANGLE.  </span>
<span class="number">  62</span><span class="c"> * Radius (if supported ) is the distance of the effect from the user </span>
<span class="number">  63</span><span class="c"> * as a value between 0 and 1. Normally it is 0. Radius is only supported if the </span>
<span class="number">  64</span><span class="c"> * device capabilities include ALLEGRO_HAPTIC_RADIUS .  </span>
<span class="number">  65</span><span class="c"> * Azimuth is the angle of elevation, between -M_PI and M_PI. 0 points to the </span>
<span class="number">  66</span><span class="c"> * horizontal plane, -M_PI points down, and M_PI points up.</span>
<span class="number">  67</span><span class="c"> * Azimuth is only supported if the device capabilities include </span>
<span class="number">  68</span><span class="c"> * ALLEGRO_HAPTIC_AZIMUTH.</span>
<span class="number">  69</span><span class="c"> * </span>
<span class="number">  70</span><span class="c"> */</span>
<span class="number">  71</span><span class="k1">struct</span> ALLEGRO_HAPTIC_DIRECTION <span class="k2">{</span>
<span class="number">  72</span>  <span class="k1">double</span> angle<span class="k2">;</span> 
<span class="number">  73</span>  <span class="k1">double</span> radius<span class="k2">;</span>
<span class="number">  74</span>  <span class="k1">double</span> azimuth<span class="k2">;</span>
<span class="number">  75</span><span class="k2">}</span><span class="k2">;</span>
<span class="number">  76</span>
<span class="number">  77</span><span class="c">/* In all of the following structs, the doubles that express duration represent </span>
<span class="number">  78</span><span class="c"> * time in seconds. The double that represent levels of intensity are between 0.0 </span>
<span class="number">  79</span><span class="c"> * and 1.0 that mean no effect and full 100% effect. */</span>
<span class="number">  80</span>
<span class="number">  81</span><span class="c">/* Delay to start the replay and duration of the replay, expressed  in seconds. */</span>
<span class="number">  82</span><span class="k1">struct</span> ALLEGRO_HAPTIC_REPLAY <span class="k2">{</span>
<span class="number">  83</span>    <span class="k1">double</span> length<span class="k2">;</span>
<span class="number">  84</span>    <span class="k1">double</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_128.html" target="_blank">delay</a><span class="k2">;</span>
<span class="number">  85</span><span class="k2">}</span><span class="k2">;</span>
<span class="number">  86</span>
<span class="number">  87</span><span class="c">/* Envelope of the effect. */</span>
<span class="number">  88</span><span class="k1">struct</span> ALLEGRO_HAPTIC_ENVELOPE <span class="k2">{</span>
<span class="number">  89</span>    <span class="k1">double</span> attack_length<span class="k2">;</span>
<span class="number">  90</span>    <span class="k1">double</span> attack_level<span class="k2">;</span>
<span class="number">  91</span>    <span class="k1">double</span> fade_length<span class="k2">;</span>
<span class="number">  92</span>    <span class="k1">double</span> fade_level<span class="k2">;</span>
<span class="number">  93</span><span class="k2">}</span><span class="k2">;</span>
<span class="number">  94</span>
<span class="number">  95</span><span class="c">/* Constant effect.  Level is between 0.0 and 1.0. */</span>
<span class="number">  96</span><span class="k1">struct</span> ALLEGRO_HAPTIC_CONSTANT_EFFECT <span class="k2">{</span>
<span class="number">  97</span>    <span class="k1">double</span> level<span class="k2">;</span>
<span class="number">  98</span>    <span class="k1">struct</span> ALLEGRO_HAPTIC_ENVELOPE envelope<span class="k2">;</span>
<span class="number">  99</span><span class="k2">}</span><span class="k2">;</span>
<span class="number"> 100</span>
<span class="number"> 101</span><span class="c">/* Ramp effect. Both start_level and end level are between 0.0 and 1.0.  */</span>
<span class="number"> 102</span><span class="k1">struct</span> ALLEGRO_HAPTIC_RAMP_EFFECT <span class="k2">{</span>
<span class="number"> 103</span>    <span class="k1">double</span> start_level<span class="k2">;</span>
<span class="number"> 104</span>    <span class="k1">double</span> end_level<span class="k2">;</span>
<span class="number"> 105</span>    <span class="k1">struct</span> ALLEGRO_HAPTIC_ENVELOPE envelope<span class="k2">;</span>
<span class="number"> 106</span><span class="k2">}</span><span class="k2">;</span>
<span class="number"> 107</span>
<span class="number"> 108</span><span class="c">/* Condition effect. */</span>
<span class="number"> 109</span><span class="k1">struct</span> ALLEGRO_HAPTIC_CONDITION_EFFECT <span class="k2">{</span>
<span class="number"> 110</span>    <span class="k1">double</span> right_saturation<span class="k2">;</span>
<span class="number"> 111</span>    <span class="k1">double</span> left_saturation<span class="k2">;</span>
<span class="number"> 112</span>    <span class="k1">double</span> right_coeff<span class="k2">;</span>
<span class="number"> 113</span>    <span class="k1">double</span> left_coeff<span class="k2">;</span>
<span class="number"> 114</span>    <span class="k1">double</span> deadband<span class="k2">;</span>
<span class="number"> 115</span>    <span class="k1">double</span> center<span class="k2">;</span>
<span class="number"> 116</span><span class="k2">}</span><span class="k2">;</span>
<span class="number"> 117</span>
<span class="number"> 118</span><span class="c">/* Periodic (wave) effect. */</span>
<span class="number"> 119</span><span class="k1">struct</span> ALLEGRO_HAPTIC_PERIODIC_EFFECT <span class="k2">{</span>
<span class="number"> 120</span>    <span class="k1">int</span> waveform<span class="k2">;</span>
<span class="number"> 121</span>    <span class="k1">double</span> period<span class="k2">;</span>
<span class="number"> 122</span>    <span class="k1">double</span> magnitude<span class="k2">;</span>
<span class="number"> 123</span>    <span class="k1">double</span> offset<span class="k2">;</span>
<span class="number"> 124</span>    <span class="k1">double</span> phase<span class="k2">;</span>
<span class="number"> 125</span>    
<span class="number"> 126</span>    <span class="k1">struct</span> ALLEGRO_HAPTIC_ENVELOPE envelope<span class="k2">;</span>
<span class="number"> 127</span>    <span class="k1">int</span>    custom_len<span class="k2">;</span>
<span class="number"> 128</span>    <span class="k1">double</span> <span class="k3">*</span>custom_data<span class="k2">;</span>
<span class="number"> 129</span><span class="k2">}</span><span class="k2">;</span>
<span class="number"> 130</span>
<span class="number"> 131</span><span class="c">/* Simple rumble effect with a magnitude between 0.0 and 1.0 for both </span>
<span class="number"> 132</span><span class="c"> the strong and the weak rumble motors in the haptic device.  */</span>
<span class="number"> 133</span><span class="k1">struct</span> ALLEGRO_HAPTIC_RUMBLE_EFFECT <span class="k2">{</span>
<span class="number"> 134</span>    <span class="k1">double</span> strong_magnitude<span class="k2">;</span>
<span class="number"> 135</span>    <span class="k1">double</span> weak_magnitude<span class="k2">;</span>
<span class="number"> 136</span><span class="k2">}</span><span class="k2">;</span>
<span class="number"> 137</span>
<span class="number"> 138</span><span class="k1">union</span> ALLEGRO_HAPTIC_EFFECT_UNION <span class="k2">{</span>
<span class="number"> 139</span>    <span class="k1">struct</span> ALLEGRO_HAPTIC_CONSTANT_EFFECT   constant<span class="k2">;</span>
<span class="number"> 140</span>    <span class="k1">struct</span> ALLEGRO_HAPTIC_RAMP_EFFECT       ramp<span class="k2">;</span>
<span class="number"> 141</span>    <span class="k1">struct</span> ALLEGRO_HAPTIC_PERIODIC_EFFECT   periodic<span class="k2">;</span>
<span class="number"> 142</span>    <span class="k1">struct</span> ALLEGRO_HAPTIC_CONDITION_EFFECT  condition<span class="k2">;</span> 
<span class="number"> 143</span>    <span class="k1">struct</span> ALLEGRO_HAPTIC_RUMBLE_EFFECT     rumble<span class="k2">;</span>
<span class="number"> 144</span><span class="k2">}</span><span class="k2">;</span>
<span class="number"> 145</span>
<span class="number"> 146</span><span class="c">/* Type: ALLEGRO_HAPTIC_EFFECT. This neeeds to be filled in and uploaded to</span>
<span class="number"> 147</span><span class="c"> * the haptic device before it can be played back. </span>
<span class="number"> 148</span><span class="c"> */</span>
<span class="number"> 149</span><span class="k1">struct</span> ALLEGRO_HAPTIC_EFFECT <span class="k2">{</span>
<span class="number"> 150</span>        <span class="k1">int</span>                                type<span class="k2">;</span>
<span class="number"> 151</span>        <span class="k1">int</span>                                id<span class="k2">;</span>
<span class="number"> 152</span>        <span class="k1">struct</span> ALLEGRO_HAPTIC_DIRECTION    direction<span class="k2">;</span>
<span class="number"> 153</span>        <span class="k1">struct</span> ALLEGRO_HAPTIC_REPLAY       replay<span class="k2">;</span>
<span class="number"> 154</span>        <span class="k1">union</span> ALLEGRO_HAPTIC_EFFECT_UNION  data<span class="k2">;</span> 
<span class="number"> 155</span><span class="k2">}</span><span class="k2">;</span>
<span class="number"> 156</span>
<span class="number"> 157</span>
<span class="number"> 158</span><span class="c">/* Type: ALLEGRO_HAPTIC_EFFECT</span>
<span class="number"> 159</span><span class="c"> */</span>
<span class="number"> 160</span><span class="k1">typedef</span> <span class="k1">struct</span> ALLEGRO_HAPTIC_EFFECT ALLEGRO_HAPTIC_EFFECT<span class="k2">;</span>
<span class="number"> 161</span>
<span class="number"> 162</span>
<span class="number"> 163</span>
<span class="number"> 164</span><span class="c">/* Type: ALLEGRO_HAPTIC_EFFECT_ID</span>
<span class="number"> 165</span><span class="c"> */</span>
<span class="number"> 166</span><span class="k1">typedef</span> <span class="k1">struct</span> ALLEGRO_HAPTIC_EFFECT_ID ALLEGRO_HAPTIC_EFFECT_ID<span class="k2">;</span>
<span class="number"> 167</span>
<span class="number"> 168</span><span class="k1">struct</span> ALLEGRO_HAPTIC_EFFECT_ID <span class="k2">{</span>
<span class="number"> 169</span>  ALLEGRO_HAPTIC <span class="k3">*</span> _haptic<span class="k2">;</span>
<span class="number"> 170</span>  <span class="k1">int</span>              _id<span class="k2">;</span>
<span class="number"> 171</span><span class="k2">}</span><span class="k2">;</span>
<span class="number"> 172</span>
<span class="number"> 173</span>
<span class="number"> 174</span>
<span class="number"> 175</span><span class="c">/* Installs the haptic (force feedback) device subsystem. */</span>
<span class="number"> 176</span>AL_FUNC<span class="k2">(</span><span class="k1">bool</span>,             al_install_haptic          , <span class="k2">(</span><span class="k1">void</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 177</span><span class="c">/* Uninstalls the haptic device subsystem. */</span>
<span class="number"> 178</span>AL_FUNC<span class="k2">(</span><span class="k1">void</span>,             al_uninstall_haptic        , <span class="k2">(</span><span class="k1">void</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 179</span><span class="c">/* Returns true if the haptic device subsystem is installed, false if not. */</span>
<span class="number"> 180</span>AL_FUNC<span class="k2">(</span><span class="k1">bool</span>,             al_is_haptic_installed     , <span class="k2">(</span><span class="k1">void</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 181</span>
<span class="number"> 182</span><span class="c">/* Returns true if the mouse has haptic capabilities, false if not.*/</span>
<span class="number"> 183</span>AL_FUNC<span class="k2">(</span><span class="k1">bool</span>,             al_is_mouse_haptic         , <span class="k2">(</span>ALLEGRO_MOUSE <span class="k3">*</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 184</span><span class="c">/* Returns true if the joystick has haptic capabilities, false if not.*/</span>
<span class="number"> 185</span>AL_FUNC<span class="k2">(</span><span class="k1">bool</span>,             al_is_joystick_haptic      , <span class="k2">(</span><a href="http://www.allegro.cc/manual/ALLEGRO_JOYSTICK"><span class="a">ALLEGRO_JOYSTICK</span></a> <span class="k3">*</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 186</span><span class="c">/* Returns true if the keyboard has haptic capabilities, false if not.*/</span>
<span class="number"> 187</span>AL_FUNC<span class="k2">(</span><span class="k1">bool</span>,             al_is_keyboard_haptic      , <span class="k2">(</span>ALLEGRO_KEYBOARD <span class="k3">*</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 188</span><span class="c">/* Returns true if the display has haptic capabilities, false if not.*/</span>
<span class="number"> 189</span>AL_FUNC<span class="k2">(</span><span class="k1">bool</span>,             al_is_display_haptic       , <span class="k2">(</span><a href="http://www.allegro.cc/manual/ALLEGRO_DISPLAY"><span class="a">ALLEGRO_DISPLAY</span></a> <span class="k3">*</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 190</span><span class="c">/* Returns true if the touch input has haptic capabilities, false if not.*/</span>
<span class="number"> 191</span>AL_FUNC<span class="k2">(</span><span class="k1">bool</span>,             al_is_touch_input_haptic   , <span class="k2">(</span>ALLEGRO_TOUCH_INPUT <span class="k3">*</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 192</span>
<span class="number"> 193</span>
<span class="number"> 194</span><span class="c">/* If the mouse has haptic capabilities, returns the associated haptic device handle. </span>
<span class="number"> 195</span><span class="c"> * Otherwise returns NULL. */</span>
<span class="number"> 196</span>AL_FUNC<span class="k2">(</span>ALLEGRO_HAPTIC <span class="k3">*</span>, al_get_haptic_from_mouse    , <span class="k2">(</span>ALLEGRO_MOUSE <span class="k3">*</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 197</span><span class="c">/* If the mouse has haptic capabilities, returns the associated haptic device handle. </span>
<span class="number"> 198</span><span class="c"> * Otherwise returns NULL. */</span>
<span class="number"> 199</span>AL_FUNC<span class="k2">(</span>ALLEGRO_HAPTIC <span class="k3">*</span>, al_get_haptic_from_joystick , <span class="k2">(</span><a href="http://www.allegro.cc/manual/ALLEGRO_JOYSTICK"><span class="a">ALLEGRO_JOYSTICK</span></a> <span class="k3">*</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 200</span><span class="c">/* If the keyboard has haptic capabilities, returns the associated haptic device handle. </span>
<span class="number"> 201</span><span class="c"> * Otherwise returns NULL. */</span>
<span class="number"> 202</span>AL_FUNC<span class="k2">(</span>ALLEGRO_HAPTIC <span class="k3">*</span>, al_get_haptic_from_keyboard , <span class="k2">(</span><a href="http://www.allegro.cc/manual/ALLEGRO_DISPLAY"><span class="a">ALLEGRO_DISPLAY</span></a> <span class="k3">*</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 203</span><span class="c">/* If the display has haptic capabilities, returns the associated haptic device handle. </span>
<span class="number"> 204</span><span class="c"> * Otherwise returns NULL. */</span>
<span class="number"> 205</span>AL_FUNC<span class="k2">(</span>ALLEGRO_HAPTIC <span class="k3">*</span>, al_get_haptic_from_display  , <span class="k2">(</span><a href="http://www.allegro.cc/manual/ALLEGRO_DISPLAY"><span class="a">ALLEGRO_DISPLAY</span></a> <span class="k3">*</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 206</span><span class="c">/* If the touch input has haptic capabilities, returns the associated haptic </span>
<span class="number"> 207</span><span class="c"> * device handle. Otherwise returns NULL. */</span>
<span class="number"> 208</span>AL_FUNC<span class="k2">(</span>ALLEGRO_HAPTIC <span class="k3">*</span>, al_get_haptic_from_touch_input, <span class="k2">(</span>ALLEGRO_TOUCH_INPUT <span class="k3">*</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 209</span>
<span class="number"> 210</span>
<span class="number"> 211</span>
<span class="number"> 212</span>
<span class="number"> 213</span><span class="c">/* Returns true if the haptic device can currently be used, false if not.*/</span>
<span class="number"> 214</span>AL_FUNC<span class="k2">(</span><span class="k1">bool</span>,   al_get_haptic_active       , <span class="k2">(</span>ALLEGRO_HAPTIC <span class="k3">*</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 215</span>
<span class="number"> 216</span><span class="c">/* Returns an integer with or'ed values from ALLEGRO_HAPTIC_CONSTANTS, that if</span>
<span class="number"> 217</span><span class="c"> set indicate that the haptic device supports the given feature. */</span>
<span class="number"> 218</span>AL_FUNC<span class="k2">(</span><span class="k1">int</span>,    al_get_haptic_capabilities , <span class="k2">(</span>ALLEGRO_HAPTIC <span class="k3">*</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 219</span>
<span class="number"> 220</span><span class="c">/* Sets the gain of the haptic device if supported. Gain is much like volume for sound, </span>
<span class="number"> 221</span><span class="c"> it is as if every effect's intensity is multiplied by it. Gain is a value between </span>
<span class="number"> 222</span><span class="c"> 0.0 and 1.0. Returns true if set sucessfully, false if not.*/</span>
<span class="number"> 223</span>AL_FUNC<span class="k2">(</span><span class="k1">bool</span>,   al_set_haptic_gain         , <span class="k2">(</span>ALLEGRO_HAPTIC <span class="k3">*</span>, <span class="k1">double</span> gain<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 224</span><span class="c">/* Returns the current gain of the device. */</span>
<span class="number"> 225</span>AL_FUNC<span class="k2">(</span><span class="k1">double</span>, al_get_haptic_gain         , <span class="k2">(</span>ALLEGRO_HAPTIC <span class="k3">*</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 226</span>
<span class="number"> 227</span>
<span class="number"> 228</span><span class="c">/* Returns the maximum amount of haptic effects that can be uploaded to the device. */</span>
<span class="number"> 229</span>AL_FUNC<span class="k2">(</span><span class="k1">int</span>,    al_get_num_haptic_effects  , <span class="k2">(</span>ALLEGRO_HAPTIC <span class="k3">*</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 230</span>
<span class="number"> 231</span><span class="c">/* Returns true if the haptic device can play the haptic effect as given, false if not. */</span>
<span class="number"> 232</span>AL_FUNC<span class="k2">(</span><span class="k1">bool</span>,   al_is_haptic_effect_ok     , <span class="k2">(</span>ALLEGRO_HAPTIC <span class="k3">*</span>, ALLEGRO_HAPTIC_EFFECT <span class="k3">*</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 233</span>
<span class="number"> 234</span><span class="c">/* Uploads the haptic effect to the device. In play_id, a handle is stored that is </span>
<span class="number"> 235</span><span class="c"> a reference to be used to control playback of the effect. */</span>
<span class="number"> 236</span>AL_FUNC<span class="k2">(</span><span class="k1">bool</span>,   al_upload_haptic_effect    , <span class="k2">(</span>ALLEGRO_HAPTIC <span class="k3">*</span>, ALLEGRO_HAPTIC_EFFECT <span class="k3">*</span>, ALLEGRO_HAPTIC_EFFECT_ID <span class="k3">*</span> play_id<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 237</span>
<span class="number"> 238</span><span class="c">/* Plays back a previously uploaded haptic effect. */</span>
<span class="number"> 239</span>AL_FUNC<span class="k2">(</span><span class="k1">bool</span>,   al_play_haptic_effect      , <span class="k2">(</span>ALLEGRO_HAPTIC_EFFECT_ID <span class="k3">*</span>, <span class="k1">int</span> loop<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 240</span>
<span class="number"> 241</span><span class="c">/* Uploads and immediately plays back the haptic effect to the device. */</span>
<span class="number"> 242</span>AL_FUNC<span class="k2">(</span><span class="k1">bool</span>,   al_upload_and_play_haptic_effect , <span class="k2">(</span>ALLEGRO_HAPTIC <span class="k3">*</span>, ALLEGRO_HAPTIC_EFFECT <span class="k3">*</span>, <span class="k1">int</span> loop, ALLEGRO_HAPTIC_EFFECT_ID <span class="k3">*</span> play_id<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 243</span>
<span class="number"> 244</span><span class="c">/* Stops playing a haptic effect . */</span>
<span class="number"> 245</span>AL_FUNC<span class="k2">(</span><span class="k1">bool</span>,   al_stop_haptic_effect      , <span class="k2">(</span>ALLEGRO_HAPTIC_EFFECT_ID <span class="k3">*</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 246</span><span class="c">/* Stops playing all haptic effects on this device. */</span>
<span class="number"> 247</span>AL_FUNC<span class="k2">(</span><span class="k1">bool</span>,   al_stop_all_haptic_effects , <span class="k2">(</span>ALLEGRO_HAPTIC <span class="k3">*</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 248</span>
<span class="number"> 249</span><span class="c">/* Returns true if the haptic effect is playing or false if not or if stopped. */</span>
<span class="number"> 250</span>AL_FUNC<span class="k2">(</span><span class="k1">bool</span>,   al_is_haptic_effect_playing, <span class="k2">(</span>ALLEGRO_HAPTIC_EFFECT_ID <span class="k3">*</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 251</span>
<span class="number"> 252</span><span class="c">/* Uploads a simple rumble effect to the haptic device and starts playback immediately.</span>
<span class="number"> 253</span><span class="c"> */</span>
<span class="number"> 254</span>AL_FUNC<span class="k2">(</span><span class="k1">bool</span>,   al_rumble_haptic, <span class="k2">(</span>ALLEGRO_HAPTIC <span class="k3">*</span>, ALLEGRO_HAPTIC_EFFECT <span class="k3">*</span>, <span class="k1">double</span> intensity, ALLEGRO_HAPTIC_EFFECT_ID <span class="k3">*</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
</div></div><p> </p><p>Edit 2: I checked the X Windows mouse, display,  and keyboard drivers, and the problem with them is that there is not trace to befound of the the underlying /dev/input/eventXX device. So there&#39;s no easy way to enable haptic support for them if any. The Linux joystick driver does have a fd of the input device that can be used to send haptic effects to, but all in all, it seems that the API I propose above could only be implemented relatively easily on on Linux for joysticks. For all other devices we&#39;d have to scan all input devices and try to match them with the corresponding X Windows input... That seems convoluted. :/
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (beoran)</author>
		<pubDate>Mon, 10 Jun 2013 11:26:44 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>We never access the underlying device files, as ostensibly X is still a network aware system, and keyboard and mouse could be on another machine. So we would probably wait the necessary support appears in X, or whatever replaces it.</p><p>(We could actually support joystick via XInput, but AFAIK no one really does so.)
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Peter Wang)</author>
		<pubDate>Tue, 11 Jun 2013 05:10:10 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>OK, that&#39;s fair enough. I can live with the idea that on X, we&#39;ll only have haptic joysticks for the time being, and then only on Linux. In theory SDL 2 is more capable than this, but I can see in practice, the API above will suffice for a first implemenation of haptics on Allegro. GLFW, for example also has a similar limitation of haptics only for joysticks. On other platforms, non-joystick haptics (like Vibrate on Android) may still be defined using al_get_haptic_from_display, etc.</p><p>With the current driver joystick support on other *BSD/*nix systems does not work anyway. And I&#39;ve been reading around a bit and it looks like on Linux we&#39;ll probably have also to support either Wayland or Mir, or both (or maybe nether and system nr 3 will come along). Those systems just boil down that we&#39;ll have to use /dev/input/eventXX for everything input related anyway. When that happens, we can enable haptic support for all these devices.</p><p>I&#39;ll start implementing the API above for Linux. I will have to refactor the Linux joystick driver a bit though since now the haptic driver will need to read the joysticks driver&#39;s internal details. Probably the same will be needed on other platforms too. But that&#39;s not a fundamental problem.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (beoran)</author>
		<pubDate>Tue, 11 Jun 2013 08:50:34 +0000</pubDate>
	</item>
</rss>
