summaryrefslogtreecommitdiffstats
path: root/media/libcubeb/src/android/cubeb-output-latency.h
blob: 403276a749a412ed796eb74d1eaea959dc110ce5 (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
#ifndef _CUBEB_OUTPUT_LATENCY_H_
#define _CUBEB_OUTPUT_LATENCY_H_

#include "../cubeb-jni.h"
#include "cubeb_media_library.h"
#include <stdbool.h>

struct output_latency_function {
  media_lib * from_lib;
  cubeb_jni * from_jni;
  int version;
};

typedef struct output_latency_function output_latency_function;

const int ANDROID_JELLY_BEAN_MR1_4_2 = 17;

output_latency_function *
cubeb_output_latency_load_method(int version)
{
  output_latency_function * ol = NULL;
  ol = (output_latency_function *)calloc(1, sizeof(output_latency_function));

  ol->version = version;

  if (ol->version > ANDROID_JELLY_BEAN_MR1_4_2) {
    ol->from_jni = cubeb_jni_init();
    return ol;
  }

  ol->from_lib = cubeb_load_media_library();
  return ol;
}

bool
cubeb_output_latency_method_is_loaded(output_latency_function * ol)
{
  assert(ol);
  if (ol->version > ANDROID_JELLY_BEAN_MR1_4_2) {
    return !!ol->from_jni;
  }

  return !!ol->from_lib;
}

void
cubeb_output_latency_unload_method(output_latency_function * ol)
{
  if (!ol) {
    return;
  }

  if (ol->version > ANDROID_JELLY_BEAN_MR1_4_2 && ol->from_jni) {
    cubeb_jni_destroy(ol->from_jni);
  }

  if (ol->version <= ANDROID_JELLY_BEAN_MR1_4_2 && ol->from_lib) {
    cubeb_close_media_library(ol->from_lib);
  }

  free(ol);
}

extern "C" {

uint32_t
cubeb_get_output_latency(output_latency_function * ol)
{
  assert(cubeb_output_latency_method_is_loaded(ol));

  if (ol->version > ANDROID_JELLY_BEAN_MR1_4_2) {
    return cubeb_get_output_latency_from_jni(ol->from_jni);
  }

  return cubeb_get_output_latency_from_media_library(ol->from_lib);
}
}

#endif // _CUBEB_OUTPUT_LATENCY_H_