1/*
2 * Copyright 2005, Axel D��rfler, axeld@pinc-software.de. All rights reserved.
3 * Distributed under the terms of the MIT License.
4 */
5
6
7#include <Application.h>
8#include <MediaRoster.h>
9#include <ParameterWeb.h>
10
11#include <stdlib.h>
12#include <stdio.h>
13#include <string.h>
14
15
16extern const char *__progname;
17static const char *sProgramName = __progname;
18
19
20int
21main(int argc, char **argv)
22{
23	BApplication app("application/x-vnd.haiku.setvolume");
24
25	BMediaRoster *roster = BMediaRoster::Roster();
26	if (roster == NULL) {
27		fprintf(stderr, "%s: media roster not available\n", sProgramName);
28		return 1;
29	}
30
31	media_node mixer;
32	status_t status = roster->GetAudioMixer(&mixer);
33	if (status != B_OK) {
34		fprintf(stderr, "%s: cannot get audio mixer: %s\n", sProgramName, strerror(status));
35		return 1;
36	}
37
38	BParameterWeb *web;
39	status = roster->GetParameterWebFor(mixer, &web);
40
41	roster->ReleaseNode(mixer);
42		// the web is all we need :-)
43
44	if (status != B_OK) {
45		fprintf(stderr, "%s: cannot get parameter web for audio mixer: %s\n",
46			sProgramName, strerror(status));
47		return 1;
48	}
49
50	BContinuousParameter *gain = NULL;
51
52	BParameter *parameter;
53	for (int32 index = 0; (parameter = web->ParameterAt(index)) != NULL; index++) {
54		if (!strcmp(parameter->Kind(), B_MASTER_GAIN)) {
55			gain = dynamic_cast<BContinuousParameter *>(parameter);
56			break;
57		}
58	}
59
60	if (gain == NULL) {
61		fprintf(stderr, "%s: could not found master gain!\n", sProgramName);
62		delete web;
63		return 1;
64	}
65
66	float volume = 0.0;
67
68	if (argc > 1) {
69		char *end;
70		volume = strtod(argv[1], &end);
71		if (end == argv[1]) {
72			fprintf(stderr, "usage: %s <volume>\n", sProgramName);
73		} else {
74			// make sure our parameter is in range
75			if (volume > gain->MaxValue())
76				volume = gain->MaxValue();
77			else if (volume < gain->MinValue())
78				volume = gain->MinValue();
79
80			gain->SetValue(&volume, sizeof(volume), system_time());
81		}
82	}
83
84	bigtime_t when;
85	size_t size = sizeof(volume);
86	gain->GetValue(&volume, &size, &when);
87
88	printf("Current volume: %g (min = %g, max = %g)\n", volume, gain->MinValue(), gain->MaxValue());
89
90	delete web;
91	return 0;
92}
93
94