components/desktop/firefox/patches/firefox-19-cubeb.patch
author Petr Sumbera <petr.sumbera@oracle.com>
Mon, 14 Nov 2016 04:25:50 -0800
branchs11u3-sru
changeset 7364 1ac24a377555
parent 7035 4c2f26e9d5ab
permissions -rw-r--r--
25034529 Upgrade Firefox to version 45.5.0 ESR 25099456 problem in FIREFOX/BROWSER
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
7035
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
     1
For SunAudio audio playback. We need to investigate whether we care about
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
     2
this or whether we are just going to support PulseAudio.
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
     3
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
     4
diff --git a/media/libcubeb/src/cubeb.c b/media/libcubeb/src/cubeb.c
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
     5
--- a/media/libcubeb/src/cubeb.c
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
     6
+++ b/media/libcubeb/src/cubeb.c
7364
1ac24a377555 25034529 Upgrade Firefox to version 45.5.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents: 7035
diff changeset
     7
@@ -60,6 +60,9 @@
1ac24a377555 25034529 Upgrade Firefox to version 45.5.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents: 7035
diff changeset
     8
 #if defined(USE_KAI)
1ac24a377555 25034529 Upgrade Firefox to version 45.5.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents: 7035
diff changeset
     9
 int kai_init(cubeb ** context, char const * context_name);
7035
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    10
 #endif
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    11
+#if defined(USE_SUN)
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    12
+int sunaudio_init(cubeb ** context, char const * context_name);
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    13
+#endif
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    14
 
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    15
 int
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    16
 validate_stream_params(cubeb_stream_params stream_params)
7364
1ac24a377555 25034529 Upgrade Firefox to version 45.5.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents: 7035
diff changeset
    17
@@ -129,6 +132,9 @@
1ac24a377555 25034529 Upgrade Firefox to version 45.5.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents: 7035
diff changeset
    18
 #if defined(USE_KAI)
1ac24a377555 25034529 Upgrade Firefox to version 45.5.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents: 7035
diff changeset
    19
     kai_init,
7035
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    20
 #endif
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    21
+#if defined(USE_SUN)
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    22
+    sunaudio_init,
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    23
+#endif
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    24
   };
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    25
   int i;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    26
 
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    27
diff --git a/media/libcubeb/src/moz.build b/media/libcubeb/src/moz.build
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    28
--- a/media/libcubeb/src/moz.build
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    29
+++ b/media/libcubeb/src/moz.build
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    30
@@ -31,6 +31,12 @@
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    31
     ]
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    32
     DEFINES['USE_SNDIO'] = True
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    33
 
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    34
+if CONFIG['OS_ARCH'] == 'SunOS':
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    35
+    SOURCES += [
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    36
+        'cubeb_sun.c',
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    37
+    ]
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    38
+    DEFINES['USE_SUN'] = True
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    39
+
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    40
 if CONFIG['OS_TARGET'] == 'Darwin':
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    41
     SOURCES += [
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    42
         'cubeb_audiounit.c',
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    43
diff --git a/media/libcubeb/src/cubeb_sun.c b/media/libcubeb/src/cubeb_sun.c
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    44
new file mode 100644
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    45
--- /dev/null
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    46
+++ b/media/libcubeb/src/cubeb_sun.c
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    47
@@ -0,0 +1,500 @@
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    48
+/*
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    49
+ * Copyright (c) 2013 Ginn Chen <[email protected]>
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    50
+ *
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    51
+ * This program is made available under an ISC-style license.  See the
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    52
+ * accompanying file LICENSE for details.
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    53
+ */
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    54
+#include <poll.h>
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    55
+#include <pthread.h>
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    56
+#include <stdlib.h>
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    57
+#include <stdio.h>
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    58
+#include <errno.h>
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    59
+#include <fcntl.h>
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    60
+#include <sys/audio.h>
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    61
+#include <sys/stat.h>
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    62
+#include <unistd.h>
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    63
+#include <sys/stropts.h>
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    64
+#include "cubeb/cubeb.h"
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    65
+#include "cubeb-internal.h"
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    66
+
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    67
+/* Macros copied from audio_oss.h */
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    68
+/*
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    69
+ * CDDL HEADER START
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    70
+ *
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    71
+ * The contents of this file are subject to the terms of the
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    72
+ * Common Development and Distribution License (the "License").
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    73
+ * You may not use this file except in compliance with the License.
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    74
+ *
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    75
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    76
+ * or http://www.opensolaris.org/os/licensing.
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    77
+ * See the License for the specific language governing permissions
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    78
+ * and limitations under the License.
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    79
+ *
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    80
+ * When distributing Covered Code, include this CDDL HEADER in each
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    81
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    82
+ * If applicable, add the following below this CDDL HEADER, with the
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    83
+ * fields enclosed by brackets "[]" replaced with your own identifying
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    84
+ * information: Portions Copyright [yyyy] [name of copyright owner]
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    85
+ *
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    86
+ * CDDL HEADER END
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    87
+ */
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    88
+/*
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    89
+ * Copyright (C) 4Front Technologies 1996-2008.
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    90
+ *
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    91
+ * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    92
+ * Use is subject to license terms.
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    93
+ */
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    94
+#define OSSIOCPARM_MASK 0x1fff          /* parameters must be < 8192 bytes */
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    95
+#define OSSIOC_VOID     0x00000000      /* no parameters */
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    96
+#define OSSIOC_OUT      0x20000000      /* copy out parameters */
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    97
+#define OSSIOC_IN       0x40000000      /* copy in parameters */
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    98
+#define OSSIOC_INOUT    (OSSIOC_IN|OSSIOC_OUT)
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    99
+#define OSSIOC_SZ(t)    ((sizeof (t) & OSSIOCPARM_MASK) << 16)
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   100
+#define __OSSIO(x, y)           ((int)(OSSIOC_VOID|(x<<8)|y))
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   101
+#define __OSSIOR(x, y, t)       ((int)(OSSIOC_OUT|OSSIOC_SZ(t)|(x<<8)|y))
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   102
+#define __OSSIOWR(x, y, t)      ((int)(OSSIOC_INOUT|OSSIOC_SZ(t)|(x<<8)|y))
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   103
+#define SNDCTL_DSP_SPEED        __OSSIOWR('P', 2, int)
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   104
+#define SNDCTL_DSP_CHANNELS     __OSSIOWR('P', 6, int)
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   105
+#define SNDCTL_DSP_SETFMT       __OSSIOWR('P', 5, int)  /* Selects ONE fmt */
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   106
+#define SNDCTL_DSP_GETODELAY    __OSSIOR('P', 23, int)
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   107
+#define SNDCTL_DSP_HALT_OUTPUT  __OSSIO('P', 34)
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   108
+#define AFMT_S16_LE     0x00000010
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   109
+#define AFMT_S16_BE     0x00000020
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   110
+
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   111
+#if defined(WORDS_BIGENDIAN) || defined(__BIG_ENDIAN__)
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   112
+#define AFMT_S16_NE    AFMT_S16_BE
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   113
+#else
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   114
+#define AFMT_S16_NE    AFMT_S16_LE
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   115
+#endif
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   116
+
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   117
+#define DEFAULT_AUDIO_DEVICE "/dev/audio"
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   118
+#define DEFAULT_DSP_DEVICE   "/dev/dsp"
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   119
+
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   120
+#define BUF_SIZE_MS 10
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   121
+
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   122
+#if defined(CUBEB_SUNAUDIO_DEBUG)
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   123
+#define DPR(...) fprintf(stderr, __VA_ARGS__);
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   124
+#else
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   125
+#define DPR(...) do {} while(0)
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   126
+#endif
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   127
+
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   128
+static struct cubeb_ops const sunaudio_ops;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   129
+
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   130
+struct cubeb {
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   131
+  struct cubeb_ops const * ops;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   132
+};
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   133
+
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   134
+struct cubeb_stream {
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   135
+  cubeb * context;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   136
+  pthread_t th;			  /* to run real-time audio i/o */
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   137
+  pthread_mutex_t mutex;	  /* protects fd and frm_played */
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   138
+  int fd;			  /* link us to sunaudio */
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   139
+  int active;			  /* cubec_start() called */
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   140
+  int conv;			  /* need float->s16 conversion */
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   141
+  int using_oss;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   142
+  unsigned char *buf;		  /* data is prepared here */
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   143
+  unsigned int rate;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   144
+  unsigned int n_channles;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   145
+  unsigned int bytes_per_ch;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   146
+  unsigned int n_frm;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   147
+  unsigned int buffer_size;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   148
+  int64_t frm_played;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   149
+  cubeb_data_callback data_cb;    /* cb to preapare data */
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   150
+  cubeb_state_callback state_cb;  /* cb to notify about state changes */
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   151
+  void *arg;			  /* user arg to {data,state}_cb */
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   152
+};
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   153
+
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   154
+static void
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   155
+float_to_s16(void *ptr, long nsamp)
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   156
+{
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   157
+  int16_t *dst = ptr;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   158
+  float *src = ptr;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   159
+
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   160
+  while (nsamp-- > 0)
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   161
+    *(dst++) = *(src++) * 32767;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   162
+}
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   163
+
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   164
+static void *
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   165
+sunaudio_mainloop(void *arg)
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   166
+{
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   167
+  struct cubeb_stream *s = arg;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   168
+  int state;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   169
+
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   170
+  DPR("sunaudio_mainloop()\n");
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   171
+
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   172
+  s->state_cb(s, s->arg, CUBEB_STATE_STARTED);
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   173
+
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   174
+  pthread_mutex_lock(&s->mutex);
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   175
+  DPR("sunaudio_mainloop(), started\n");
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   176
+
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   177
+  for (;;) {
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   178
+    if (!s->active) {
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   179
+      DPR("sunaudio_mainloop() stopped\n");
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   180
+      state = CUBEB_STATE_STOPPED;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   181
+      break;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   182
+    }
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   183
+
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   184
+    if (!s->using_oss) {
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   185
+      audio_info_t info;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   186
+      ioctl(s->fd, AUDIO_GETINFO, &info);
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   187
+      if (s->frm_played > info.play.samples + 3 * s->n_frm) {
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   188
+        pthread_mutex_unlock(&s->mutex);
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   189
+        struct timespec ts = {0, 10000}; // 10 ms
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   190
+        nanosleep(&ts, NULL);
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   191
+        pthread_mutex_lock(&s->mutex);
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   192
+        continue;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   193
+      }
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   194
+    }
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   195
+
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   196
+    pthread_mutex_unlock(&s->mutex);
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   197
+    unsigned int got = s->data_cb(s, s->arg, s->buf, s->n_frm);
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   198
+    DPR("sunaudio_mainloop() ask %d got %d\n", s->n_frm, got);
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   199
+    pthread_mutex_lock(&s->mutex);
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   200
+
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   201
+    if (got < 0) {
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   202
+      DPR("sunaudio_mainloop() cb err\n");
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   203
+      state = CUBEB_STATE_ERROR;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   204
+      break;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   205
+    }
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   206
+
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   207
+    if (s->conv) {
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   208
+      float_to_s16(s->buf, got * s->n_channles);
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   209
+    }
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   210
+
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   211
+    unsigned int avail = got * 2 * s->n_channles; // coverted to s16
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   212
+    unsigned int pos = 0;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   213
+
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   214
+    while (avail > 0 && s->active) {
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   215
+      int written = write(s->fd, s->buf + pos, avail);
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   216
+      if (written == -1) {
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   217
+        if (errno != EINTR && errno != EWOULDBLOCK) {
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   218
+          DPR("sunaudio_mainloop() write err\n");
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   219
+          state = CUBEB_STATE_ERROR;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   220
+          break;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   221
+        }
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   222
+        pthread_mutex_unlock(&s->mutex);
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   223
+        struct timespec ts = {0, 10000}; // 10 ms
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   224
+        nanosleep(&ts, NULL);
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   225
+        pthread_mutex_lock(&s->mutex);
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   226
+      } else {
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   227
+        pos += written;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   228
+        DPR("sunaudio_mainloop() write %d pos %d\n", written, pos);
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   229
+        s->frm_played += written / 2 / s->n_channles;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   230
+        avail -= written;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   231
+      }
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   232
+    }
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   233
+
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   234
+    if ((got  < s->n_frm)) {
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   235
+      DPR("sunaudio_mainloop() drained\n");
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   236
+      state = CUBEB_STATE_DRAINED;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   237
+      break;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   238
+    }
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   239
+  }
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   240
+
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   241
+  pthread_mutex_unlock(&s->mutex);
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   242
+  s->state_cb(s, s->arg, state);
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   243
+
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   244
+  return NULL;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   245
+}
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   246
+
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   247
+/*static*/ int
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   248
+sunaudio_init(cubeb **context, char const *context_name)
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   249
+{
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   250
+  DPR("sunaudio_init(%s)\n", context_name);
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   251
+  *context = malloc(sizeof(*context));
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   252
+  (*context)->ops = &sunaudio_ops;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   253
+  (void)context_name;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   254
+  return CUBEB_OK;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   255
+}
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   256
+
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   257
+static char const *
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   258
+sunaudio_get_backend_id(cubeb *context)
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   259
+{
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   260
+  return "sunaudio";
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   261
+}
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   262
+
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   263
+static void
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   264
+sunaudio_destroy(cubeb *context)
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   265
+{
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   266
+  DPR("sunaudio_destroy()\n");
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   267
+  free(context);
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   268
+}
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   269
+
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   270
+static int
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   271
+sunaudio_stream_init(cubeb *context,
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   272
+                  cubeb_stream **stream,
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   273
+                  char const *stream_name,
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   274
+                  cubeb_stream_params stream_params, unsigned int latency,
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   275
+                  cubeb_data_callback data_callback,
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   276
+                  cubeb_state_callback state_callback,
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   277
+                  void *user_ptr)
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   278
+{
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   279
+  struct cubeb_stream *s;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   280
+  DPR("sunaudio_stream_init(%s)\n", stream_name);
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   281
+  size_t size;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   282
+
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   283
+  s = malloc(sizeof(struct cubeb_stream));
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   284
+  if (s == NULL)
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   285
+    return CUBEB_ERROR;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   286
+  s->context = context;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   287
+
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   288
+  // If UTAUDIODEV is set, use it with Sun Audio interface
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   289
+  char * sa_device_name = getenv("UTAUDIODEV");
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   290
+  char * dsp_device_name = NULL;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   291
+  if (!sa_device_name) {
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   292
+    dsp_device_name = getenv("AUDIODSP");
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   293
+    if (!dsp_device_name) {
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   294
+      dsp_device_name = DEFAULT_DSP_DEVICE;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   295
+    }
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   296
+    sa_device_name = getenv("AUDIODEV");
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   297
+    if (!sa_device_name) {
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   298
+      sa_device_name = DEFAULT_AUDIO_DEVICE;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   299
+    }
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   300
+  }
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   301
+
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   302
+  s->using_oss = 0;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   303
+  // Try to use OSS if available
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   304
+  if (dsp_device_name) {
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   305
+    s->fd = open(dsp_device_name, O_WRONLY | O_NONBLOCK);
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   306
+    if (s->fd >= 0) {
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   307
+      s->using_oss = 1;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   308
+    }
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   309
+  }
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   310
+
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   311
+  // Try Sun Audio
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   312
+  if (!s->using_oss) {
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   313
+    s->fd = open(sa_device_name, O_WRONLY | O_NONBLOCK);
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   314
+  }
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   315
+
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   316
+  if (s->fd < 0) {
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   317
+    free(s);
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   318
+    DPR("sunaudio_stream_init(), open() failed\n");
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   319
+    return CUBEB_ERROR;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   320
+  }
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   321
+
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   322
+  if (s->using_oss) {
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   323
+    if (ioctl(s->fd, SNDCTL_DSP_SPEED, &stream_params.rate) < 0) {
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   324
+      DPR("ioctl SNDCTL_DSP_SPEED failed.\n");
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   325
+      close(s->fd);
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   326
+      free(s);
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   327
+      return CUBEB_ERROR_INVALID_FORMAT;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   328
+    }
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   329
+
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   330
+    if (ioctl(s->fd, SNDCTL_DSP_CHANNELS, &stream_params.channels) < 0) {
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   331
+      DPR("ioctl SNDCTL_DSP_CHANNELS failed.\n");
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   332
+      close(s->fd);
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   333
+      free(s);
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   334
+      return CUBEB_ERROR_INVALID_FORMAT;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   335
+    }
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   336
+
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   337
+    int format = AFMT_S16_NE;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   338
+    if (ioctl(s->fd, SNDCTL_DSP_SETFMT, &format) < 0) {
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   339
+      DPR("ioctl SNDCTL_DSP_SETFMT failed.\n");
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   340
+      close(s->fd);
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   341
+      free(s);
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   342
+      return CUBEB_ERROR_INVALID_FORMAT;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   343
+    }
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   344
+  } else {
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   345
+    audio_info_t audio_info;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   346
+    AUDIO_INITINFO(&audio_info)
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   347
+    audio_info.play.sample_rate = stream_params.rate;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   348
+    audio_info.play.channels = stream_params.channels;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   349
+    audio_info.play.encoding = AUDIO_ENCODING_LINEAR;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   350
+    audio_info.play.precision = 16;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   351
+    if (ioctl(s->fd, AUDIO_SETINFO, &audio_info) == -1) {
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   352
+      DPR("ioctl AUDIO_SETINFO failed.\n");
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   353
+      close(s->fd);
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   354
+      free(s);
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   355
+      return CUBEB_ERROR_INVALID_FORMAT;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   356
+    }
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   357
+  }
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   358
+
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   359
+  s->conv = 0;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   360
+  switch (stream_params.format) {
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   361
+    case CUBEB_SAMPLE_S16NE:
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   362
+      s->bytes_per_ch = 2;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   363
+      break;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   364
+    case CUBEB_SAMPLE_FLOAT32NE:
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   365
+      s->bytes_per_ch = 4;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   366
+      s->conv = 1;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   367
+      break;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   368
+    default:
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   369
+      DPR("sunaudio_stream_init() unsupported format\n");
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   370
+      close(s->fd);
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   371
+      free(s);
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   372
+      return CUBEB_ERROR_INVALID_FORMAT;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   373
+  }
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   374
+
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   375
+  s->active = 0;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   376
+  s->rate = stream_params.rate;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   377
+  s->n_channles = stream_params.channels;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   378
+  s->data_cb = data_callback;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   379
+  s->state_cb = state_callback;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   380
+  s->arg = user_ptr;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   381
+  if (pthread_mutex_init(&s->mutex, NULL) != 0) {
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   382
+    free(s);
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   383
+    return CUBEB_ERROR;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   384
+  }
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   385
+  s->frm_played = 0;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   386
+  s->n_frm = s->rate * BUF_SIZE_MS / 1000;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   387
+  s->buffer_size = s->bytes_per_ch * s->n_channles * s->n_frm;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   388
+  s->buf = malloc(s->buffer_size);
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   389
+  if (s->buf == NULL) {
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   390
+    close(s->fd);
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   391
+    free(s);
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   392
+    return CUBEB_ERROR;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   393
+  }
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   394
+
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   395
+  *stream = s;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   396
+  DPR("sunaudio_stream_init() end, ok\n");
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   397
+  return CUBEB_OK;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   398
+}
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   399
+
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   400
+static void
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   401
+sunaudio_stream_destroy(cubeb_stream *s)
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   402
+{
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   403
+  DPR("sunaudio_stream_destroy()\n");
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   404
+  if (s->fd > 0) {
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   405
+    // Flush buffer
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   406
+    if (s->using_oss) {
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   407
+      ioctl(s->fd, SNDCTL_DSP_HALT_OUTPUT);
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   408
+    } else {
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   409
+      ioctl(s->fd, I_FLUSH);
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   410
+    }
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   411
+    close(s->fd);
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   412
+  }
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   413
+  free(s->buf);
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   414
+  free(s);
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   415
+}
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   416
+
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   417
+static int
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   418
+sunaudio_stream_start(cubeb_stream *s)
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   419
+{
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   420
+  int err;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   421
+
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   422
+  DPR("sunaudio_stream_start()\n");
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   423
+  s->active = 1;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   424
+  err = pthread_create(&s->th, NULL, sunaudio_mainloop, s);
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   425
+  if (err) {
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   426
+    s->active = 0;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   427
+    return CUBEB_ERROR;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   428
+  }
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   429
+  return CUBEB_OK;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   430
+}
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   431
+
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   432
+static int
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   433
+sunaudio_stream_stop(cubeb_stream *s)
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   434
+{
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   435
+  void *dummy;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   436
+
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   437
+  DPR("sunaudio_stream_stop()\n");
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   438
+  if (s->active) {
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   439
+    s->active = 0;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   440
+    pthread_join(s->th, &dummy);
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   441
+  }
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   442
+  return CUBEB_OK;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   443
+}
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   444
+
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   445
+static int
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   446
+sunaudio_stream_get_position(cubeb_stream *s, uint64_t *p)
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   447
+{
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   448
+  int rv = CUBEB_OK;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   449
+  pthread_mutex_lock(&s->mutex);
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   450
+  if (s->active && s->fd > 0) {
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   451
+    if (s->using_oss) {
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   452
+      int delay;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   453
+      ioctl(s->fd, SNDCTL_DSP_GETODELAY, &delay);
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   454
+      int64_t t = s->frm_played - delay / s->n_channles / 2;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   455
+      if (t < 0) {
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   456
+        *p = 0;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   457
+      } else {
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   458
+        *p = t;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   459
+      }
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   460
+    } else {
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   461
+      audio_info_t info;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   462
+      ioctl(s->fd, AUDIO_GETINFO, &info);
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   463
+      *p = info.play.samples;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   464
+    }
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   465
+    DPR("sunaudio_stream_get_position() %lld\n", *p);
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   466
+  } else {
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   467
+    rv = CUBEB_ERROR;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   468
+  }
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   469
+  pthread_mutex_unlock(&s->mutex);
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   470
+  return rv;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   471
+}
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   472
+
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   473
+static int
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   474
+sunaudio_get_max_channel_count(cubeb * ctx, uint32_t * max_channels)
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   475
+{
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   476
+  if (!ctx || !max_channels)
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   477
+    return CUBEB_ERROR;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   478
+
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   479
+  *max_channels = 2;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   480
+
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   481
+  return CUBEB_OK;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   482
+}
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   483
+
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   484
+static int
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   485
+sunaudio_get_preferred_sample_rate(cubeb * ctx, uint32_t * rate)
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   486
+{
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   487
+  if (!ctx || !rate)
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   488
+    return CUBEB_ERROR;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   489
+
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   490
+  // XXX Not yet implemented.
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   491
+  *rate = 44100;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   492
+
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   493
+  return CUBEB_OK;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   494
+}
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   495
+
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   496
+static int
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   497
+sunaudio_get_min_latency(cubeb * ctx, cubeb_stream_params params, uint32_t * latency_ms)
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   498
+{
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   499
+  if (!ctx || !latency_ms)
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   500
+    return CUBEB_ERROR;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   501
+
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   502
+  // XXX Not yet implemented.
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   503
+  *latency_ms = 20;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   504
+
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   505
+  return CUBEB_OK;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   506
+}
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   507
+
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   508
+static int
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   509
+sunaudio_stream_get_latency(cubeb_stream * s, uint32_t * latency)
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   510
+{
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   511
+  if (!s || !latency)
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   512
+    return CUBEB_ERROR;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   513
+
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   514
+  int rv = CUBEB_OK;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   515
+  pthread_mutex_lock(&s->mutex);
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   516
+  if (s->active && s->fd > 0) {
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   517
+    if (s->using_oss) {
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   518
+      int delay;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   519
+      ioctl(s->fd, SNDCTL_DSP_GETODELAY, &delay);
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   520
+      *latency = delay / s->n_channles / 2 / s->rate;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   521
+    } else {
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   522
+      audio_info_t info;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   523
+      ioctl(s->fd, AUDIO_GETINFO, &info);
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   524
+      *latency = (s->frm_played - info.play.samples) / s->rate;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   525
+    }
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   526
+    DPR("sunaudio_stream_get_position() %lld\n", *p);
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   527
+  } else {
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   528
+    rv = CUBEB_ERROR;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   529
+  }
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   530
+  pthread_mutex_unlock(&s->mutex);
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   531
+  return rv;
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   532
+}
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   533
+
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   534
+static struct cubeb_ops const sunaudio_ops = {
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   535
+  .init = sunaudio_init,
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   536
+  .get_backend_id = sunaudio_get_backend_id,
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   537
+  .destroy = sunaudio_destroy,
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   538
+  .get_preferred_sample_rate = sunaudio_get_preferred_sample_rate,
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   539
+  .stream_init = sunaudio_stream_init,
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   540
+  .stream_destroy = sunaudio_stream_destroy,
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   541
+  .stream_start = sunaudio_stream_start,
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   542
+  .stream_stop = sunaudio_stream_stop,
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   543
+  .stream_get_position = sunaudio_stream_get_position,
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   544
+  .get_max_channel_count = sunaudio_get_max_channel_count,
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   545
+  .get_min_latency = sunaudio_get_min_latency,
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   546
+  .stream_get_latency = sunaudio_stream_get_latency
4c2f26e9d5ab 24361911 Upgrade Firefox to version 45.4.0 ESR
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   547
+};