1/*
2 * Copyright (c) 2002, 2007, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.  Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26#ifndef PORTS_INCLUDED
27#define PORTS_INCLUDED
28
29
30#include "SoundDefs.h"
31// for memset
32#include <string.h>
33#include "Configure.h"  // put flags for debug msgs etc. here
34#include "Utilities.h"
35#include <com_sun_media_sound_PortMixer.h>
36
37
38/* *********************** PORT TYPES (for all platforms) ******************************* */
39
40#define PORT_SRC_UNKNOWN      (com_sun_media_sound_PortMixer_SRC_UNKNOWN)
41#define PORT_SRC_MICROPHONE   (com_sun_media_sound_PortMixer_SRC_MICROPHONE)
42#define PORT_SRC_LINE_IN      (com_sun_media_sound_PortMixer_SRC_LINE_IN)
43#define PORT_SRC_COMPACT_DISC (com_sun_media_sound_PortMixer_SRC_COMPACT_DISC)
44#define PORT_SRC_MASK         (com_sun_media_sound_PortMixer_SRC_MASK)
45#define PORT_DST_UNKNOWN      (com_sun_media_sound_PortMixer_DST_UNKNOWN)
46#define PORT_DST_SPEAKER      (com_sun_media_sound_PortMixer_DST_SPEAKER)
47#define PORT_DST_HEADPHONE    (com_sun_media_sound_PortMixer_DST_HEADPHONE)
48#define PORT_DST_LINE_OUT     (com_sun_media_sound_PortMixer_DST_LINE_OUT)
49#define PORT_DST_MASK         (com_sun_media_sound_PortMixer_DST_MASK)
50
51#define PORT_STRING_LENGTH 200
52
53typedef struct tag_PortMixerDescription {
54    char name[PORT_STRING_LENGTH];
55    char vendor[PORT_STRING_LENGTH];
56    char description[PORT_STRING_LENGTH];
57    char version[PORT_STRING_LENGTH];
58} PortMixerDescription;
59
60
61// for BooleanControl.Type
62#define CONTROL_TYPE_MUTE        ((char*) 1)
63#define CONTROL_TYPE_SELECT      ((char*) 2)
64
65// for FloatControl.Type
66#define CONTROL_TYPE_BALANCE     ((char*) 1)
67#define CONTROL_TYPE_MASTER_GAIN ((char*) 2)
68#define CONTROL_TYPE_PAN         ((char*) 3)
69#define CONTROL_TYPE_VOLUME      ((char*) 4)
70#define CONTROL_TYPE_MAX         4
71
72// method definitions
73
74/* controlID: unique ID for this control
75 * type: string that is used to construct the BooleanControl.Type, or CONTROL_TYPE_MUTE
76 * creator: pointer to the creator struct provided by PORT_GetControls
77 * returns an opaque pointer to the created control
78 */
79typedef void* (*PORT_NewBooleanControlPtr)(void* creator, void* controlID, char* type);
80
81/* type: string that is used to construct the CompoundControl.Type
82 * controls: an array of opaque controls returned by the CreateXXXControlPtr functions
83 * controlCount: number of elements in controls
84 * creator: pointer to the creator struct provided by PORT_GetControls
85 * returns an opaque pointer to the created control
86 */
87typedef void* (*PORT_NewCompoundControlPtr)(void* creator, char* type, void** controls, int controlCount);
88
89/* controlID: unique ID for this control
90 * type: string that is used to construct the FloatControl.Type, or one of
91 *       CONTROL_TYPE_BALANCE, CONTROL_TYPE_MASTER_GAIN, CONTROL_TYPE_PAN, CONTROL_TYPE_VOLUME
92 * creator: pointer to the creator struct provided by PORT_GetControls
93 * returns an opaque pointer to the created control
94 */
95typedef void* (*PORT_NewFloatControlPtr)(void* creator, void* controlID, char* type,
96              float min, float max, float precision, const char* units);
97
98/* control: The control to add to current port
99 * creator: pointer to the creator struct provided by PORT_GetControls
100 * returns TRUE or FALSE
101 */
102typedef int (*PORT_AddControlPtr)(void* creator, void* control);
103
104// struct for dynamically instantiating the controls from platform dependent code
105// without creating a dependency from the platform code to JNI
106
107typedef struct tag_PortControlCreator {
108    PORT_NewBooleanControlPtr newBooleanControl;
109    PORT_NewCompoundControlPtr newCompoundControl;
110    PORT_NewFloatControlPtr newFloatControl;
111    PORT_AddControlPtr addControl;
112} PortControlCreator;
113
114#if (USE_PORTS == TRUE)
115
116// the following methods need to be implemented by the platform dependent code
117INT32 PORT_GetPortMixerCount();
118INT32 PORT_GetPortMixerDescription(INT32 mixerIndex, PortMixerDescription* description);
119void* PORT_Open(INT32 mixerIndex);
120void  PORT_Close(void* id);
121
122INT32 PORT_GetPortCount(void* id);
123INT32 PORT_GetPortType(void* id, INT32 portIndex);
124INT32 PORT_GetPortName(void* id, INT32 portIndex, char* name, INT32 len);
125void  PORT_GetControls(void* id, INT32 portIndex, PortControlCreator* creator);
126float PORT_GetFloatValue(void* controlID);
127INT32 PORT_GetIntValue(void* controlIDV);
128void  PORT_SetFloatValue(void* controlID, float value);
129void  PORT_SetIntValue(void* controlIDV, INT32 value);
130
131#endif // USE_PORTS
132
133#endif // PORTS_INCLUDED
134