source: roaraudio/roard/hwmixer.c @ 4361:135e78128e19

Last change on this file since 4361:135e78128e19 was 4361:135e78128e19, checked in by phi, 14 years ago

added very basic mixer setup rutines

File size: 4.4 KB
Line 
1//hwmixer.c:
2
3/*
4 *      Copyright (C) Philipp 'ph3-der-loewe' Schafft - 2010
5 *
6 *  This file is part of roard a part of RoarAudio,
7 *  a cross-platform sound system for both, home and professional use.
8 *  See README for details.
9 *
10 *  This file is free software; you can redistribute it and/or modify
11 *  it under the terms of the GNU General Public License version 3
12 *  as published by the Free Software Foundation.
13 *
14 *  RoarAudio is distributed in the hope that it will be useful,
15 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
16 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 *  GNU General Public License for more details.
18 *
19 *  You should have received a copy of the GNU General Public License
20 *  along with this software; see the file COPYING.  If not, write to
21 *  the Free Software Foundation, 51 Franklin Street, Fifth Floor,
22 *  Boston, MA 02110-1301, USA.
23 *
24 */
25
26#include "roard.h"
27
28#define FLAG_NONE     0x0000
29#define FLAG_FHSEC    0x0001
30
31struct hwmixer;
32
33struct hwmixer_stream {
34 struct hwmixer * hwmixer;
35 int basestream;
36 int stream;
37 void * baseud;
38 void * ud;
39};
40
41struct hwmixer {
42 const char * name;
43 const char * desc;
44 const char * devs;
45 int flags;
46 int (*open)(struct hwmixer_stream * stream, char * drv, char * dev, int fh, char * basename, struct roar_keyval * subnames, size_t subnamelen);
47 int (*close)(struct hwmixer_stream * stream);
48 int (*set_vol)(struct hwmixer_stream * stream, int channels, int mode, struct roar_mixer_settings * settings);
49 int (*get_vol)(struct hwmixer_stream * stream, int channels, int mode, struct roar_mixer_settings * settings);
50};
51
52static int __true (void) { return 0; }
53
54struct hwmixer g_hwmixers[] = {
55 {"oss",  "OSS Mixer", "/dev/mixer*", FLAG_FHSEC, NULL, NULL, NULL, NULL},
56 {"file", "Write to plain file", "/some/file", FLAG_FHSEC, NULL, NULL, NULL, NULL},
57 {"dstr", "Write to DSTR",       "/some/file", FLAG_NONE,  NULL, NULL, NULL, NULL},
58 {"null", "Null Mixer",          NULL, FLAG_NONE,  __true, __true, __true, __true},
59 {NULL,   NULL, NULL, FLAG_NONE, NULL, NULL, NULL, NULL}
60};
61
62void print_hwmixerlist (void) {
63 struct hwmixer * mixer;
64 int i;
65
66 printf("  Source   Flag Subsys - Description (devices)\n");
67 printf("------------------------------------------------------\n");
68
69 for (i = 0; (mixer = &(g_hwmixers[i]))->name != NULL; i++) {
70  printf("  %-9s %c   Mixer  - %s (devices: %s)\n",
71         mixer->name,
72         mixer->flags & FLAG_FHSEC ? 's' : ' ',
73         mixer->desc,
74         mixer->devs == NULL ? "(none)" : mixer->devs
75        );
76 }
77}
78
79void hwmixer_setup_info(struct hwmixer_stream * mstream) {
80 struct roar_stream_server * ss;
81
82 streams_get(mstream->stream, &ss);
83
84 memset(&(ROAR_STREAM(ss)->info), 0, sizeof(ROAR_STREAM(ss)->info));
85
86 streams_set_dir(mstream->stream, ROAR_DIR_MIXING, 1);
87
88 streams_set_flag(mstream->stream, ROAR_FLAG_HWMIXER);
89}
90
91int hwmixer_open(int basestream, char * drv, char * dev, int fh, char * basename, char * subnames) {
92 struct roar_keyval * subnamekv = NULL;
93 struct hwmixer * mixer = NULL;
94 struct hwmixer_stream * stream;
95 ssize_t subnamekvlen = 0;
96 int i;
97 int ret;
98
99 for (i = 0; g_hwmixers[i].name != NULL; i++) {
100  if ( !strcmp(g_hwmixers[i].name, drv) ) {
101   mixer = &(g_hwmixers[i]);
102   break;
103  }
104 }
105
106 if ( mixer == NULL ) {
107  ROAR_WARN("hwmixer_open(basestream=%i, drv='%s', dev='%s', fh=%i, basename='%s', subnames='%s'): Driver not found.", basestream, drv, dev, fh, basename, subnames);
108  return -1;
109 }
110
111 if ( mixer->open == NULL ) {
112  return -1;
113 }
114
115 if ( fh != -1 && !(mixer->flags & FLAG_FHSEC) ) {
116  return -1;
117 }
118
119 stream = roar_mm_malloc(sizeof(struct hwmixer_stream));
120 if ( stream == NULL )
121  return -1;
122
123 memset(stream, 0, sizeof(struct hwmixer_stream));
124
125 stream->hwmixer    = mixer;
126 stream->basestream = basestream;
127 stream->stream     = basestream;
128 stream->baseud     = NULL;
129 stream->ud         = NULL;
130
131 if ( basename == NULL ) {
132  streams_set_name(basestream, "Hardware Mixer");
133 } else {
134  streams_set_name(basestream, basename);
135 }
136
137 ret = mixer->open(stream, drv, dev, fh, basename, subnamekv, subnamekvlen);
138
139 if ( ret == -1 ) {
140  roar_mm_free(stream);
141  return -1;
142 }
143
144 hwmixer_setup_info(stream);
145
146 streams_set_mixerstream(basestream, stream);
147
148 return 0;
149}
150
151int hwmixer_close(int stream) {
152 struct hwmixer_stream * mstream = streams_get_mixerstream(stream);
153
154 if ( mstream == NULL )
155  return 0;
156
157 if ( mstream->hwmixer->close != NULL )
158  mstream->hwmixer->close(mstream);
159
160 roar_mm_free(mstream);
161
162 return 0;
163}
164
165//ll
Note: See TracBrowser for help on using the repository browser.