summaryrefslogtreecommitdiff
path: root/sys/androidmedia/gst-android-hardware-sensor.h
blob: 2dc79dca8b7f0dde6a666bdcbc404334c1d25cd6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
/*
 * Copyright (C) 2016 SurroundIO
 *   Author: Martin Kelly <martin@surround.io>
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Library General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Library General Public License for more details.
 *
 * You should have received a copy of the GNU Library General Public
 * License along with this library; if not, write to the
 * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
 * Boston, MA 02110-1301, USA.
 */

#ifndef __GST_ANDROID_HARDWARE_SENSOR_H__
#define __GST_ANDROID_HARDWARE_SENSOR_H__

#include <gst/gst.h>
#include <jni.h>

#include "gstsensors.h"

G_BEGIN_DECLS

typedef struct GstAHSensor
{
  /* < private > */
  jobject object;
} GstAHSensor;

typedef struct GstAHSensorData
{
  jfloatArray array;
  gfloat *values;
} GstAHSensorData;

typedef struct GstAHSensorEvent
{
  /*
   * Note that we don't use the Android event timestamp, as it's not reliable.
   * See https://code.google.com/p/android/issues/detail?id=7981 for more
   * details.
   */
  gint32 accuracy;
  GstAHSensorData data;
} GstAHSensorEvent;

typedef struct GstAHSensorEventListener
{
  /* < private > */
  jobject object;

  gboolean registered;
} GstAHSensorEventListener;

typedef struct GstAHSensorManager
{
  /* < private > */
  jobject object;
} GstAHSensorManager;

gint gst_android_sensor_type_from_string (const gchar * type_str);

/* android.hardware.SensorListener onSensorChanged */
typedef void (*GstAHSensorCallback) (jobject sensor_event, gpointer user_data);

/* android.hardware.SensorListener onAccuracyChanged */
typedef void (*GstAHSAccuracyCallback) (jobject sensor, gint32 accuracy,
    gpointer user_data);

gboolean gst_android_hardware_sensor_init (void);
void gst_android_hardware_sensor_deinit (void);

/*
 * Example usage (excluding error checking):
 *
 * GstAHSensorManager *manager = gst_ah_sensor_get_manager ();
 * GstAHSensor *sensor =
 *     gst_ah_sensor_get_default_sensor (manager, * sensor_type);
 * GstAHSensorEventListener *listener =
 *     gst_ah_sensor_create_listener * (change_cb, accuracy_cb, self);
 * gst_ah_sensor_register_listener (manager, listener, sensor,
 *     SensorDelay_SENSOR_DELAY_NORMAL);
 */
GstAHSensorManager *gst_ah_sensor_get_manager (void);
GstAHSensor *gst_ah_sensor_get_default_sensor (GstAHSensorManager * manager,
    gint32 sensor_type);
GstAHSensorEventListener *gst_ah_sensor_create_listener (GstAHSensorCallback
    sensor_cb, GstAHSAccuracyCallback accuracy_cb, gpointer user_data);
gboolean gst_ah_sensor_register_listener (GstAHSensorManager * self,
    GstAHSensorEventListener * listener, GstAHSensor * sensor, gint32 delay);
void gst_ah_sensor_unregister_listener (GstAHSensorManager * self,
    GstAHSensorEventListener * listener);

gboolean gst_ah_sensor_populate_event (GstAHSensorEvent * event,
    jobject event_object, gint size);
void gst_ah_sensor_free_sensor_data (GstAHSensorData * data);

/*
 * These constants come from the matching SENSOR_DELAY_* TYPE_* constants found
 * in the Android documentation:
 *
 * SENSOR_DELAY_*:
 * https://developer.android.com/reference/android/hardware/SensorManager.html
 *
 * TYPE_*:
 * https://developer.android.com/reference/android/hardware/Sensor.html
 *
 * They are intended to be passed into the registerListener callback for
 * listener registration. Note that, although these are hardcoded, we also do
 * paranoid runtime checks during plugin init to verify that the API values
 * haven't changed. This is unlikely but seems like a good precaution. When
 * adding values, please keep the two lists in sync.
 */
enum
{
  AHS_SENSOR_DELAY_FASTEST = 0,
  AHS_SENSOR_DELAY_GAME = 1,
  AHS_SENSOR_DELAY_NORMAL = 3,
  AHS_SENSOR_DELAY_UI = 2
};

enum
{
  AHS_SENSOR_TYPE_ACCELEROMETER = 0x1,
  AHS_SENSOR_TYPE_AMBIENT_TEMPERATURE = 0xd,
  AHS_SENSOR_TYPE_GAME_ROTATION_VECTOR = 0xf,
  AHS_SENSOR_TYPE_GEOMAGNETIC_ROTATION_VECTOR = 0x14,
  AHS_SENSOR_TYPE_GRAVITY = 0x9,
  AHS_SENSOR_TYPE_GYROSCOPE = 0x4,
  AHS_SENSOR_TYPE_GYROSCOPE_UNCALIBRATED = 0x10,
  AHS_SENSOR_TYPE_HEART_RATE = 0x15,
  AHS_SENSOR_TYPE_LIGHT = 0x5,
  AHS_SENSOR_TYPE_LINEAR_ACCELERATION = 0xa,
  AHS_SENSOR_TYPE_MAGNETIC_FIELD = 0x2,
  AHS_SENSOR_TYPE_MAGNETIC_FIELD_UNCALIBRATED = 0xe,
  AHS_SENSOR_TYPE_ORIENTATION = 0x3,
  AHS_SENSOR_TYPE_PRESSURE = 0x6,
  AHS_SENSOR_TYPE_PROXIMITY = 0x8,
  AHS_SENSOR_TYPE_RELATIVE_HUMIDITY = 0xc,
  AHS_SENSOR_TYPE_ROTATION_VECTOR = 0xb,
  AHS_SENSOR_TYPE_SIGNIFICANT_MOTION = 0x11,
  AHS_SENSOR_TYPE_STEP_COUNTER = 0x13,
  AHS_SENSOR_TYPE_STEP_DETECTOR = 0x12
};

gsize gst_ah_sensor_get_sensor_data_size (gint sensor_type);

G_END_DECLS
#endif /* __GST_ANDROID_HARDWARE_SENSOR_H__ */