I attach a patch that updates the speaker-test program.
It corrects a few minor bugs as well as add a new -s option.
Diff is with the alsa-utils cvs.
Cheers
James
Index: alsa-utils/speaker-test/readme.txt
===================================================================
RCS file: /cvsroot/alsa/alsa-utils/speaker-test/readme.txt,v
retrieving revision 1.1
diff -u -r1.1 readme.txt
--- alsa-utils/speaker-test/readme.txt 10 May 2004 14:28:03 -0000 1.1
+++ alsa-utils/speaker-test/readme.txt 16 May 2004 00:20:23 -0000
@@ -4,9 +4,11 @@
To test: -
1) Just stereo sound from one stereo jack: -
-./speaker-test -Dfront -c 2
+./speaker-test -Dfront -c2
2) A 4 speaker setup from two stereo jacks: -
-./speaker-test -Dsurround40 -c 4
+./speaker-test -Dsurround40 -c4
3) A 5.1 speaker setup from three stereo jacks: -
-./speaker-test -Dsurround51 -c 6
+./speaker-test -Dsurround51 -c6
+4) To send a nice low 75Hz tone to the Woofer and then exit without touching any
other speakers: -
+./speaker-test -Dplug:surround51 -c6 -s1 -f75
Index: alsa-utils/speaker-test/speaker-test.c
===================================================================
RCS file: /cvsroot/alsa/alsa-utils/speaker-test/speaker-test.c,v
retrieving revision 1.1
diff -u -r1.1 speaker-test.c
--- alsa-utils/speaker-test/speaker-test.c 10 May 2004 14:28:03 -0000 1.1
+++ alsa-utils/speaker-test/speaker-test.c 16 May 2004 00:20:23 -0000
@@ -10,7 +10,7 @@
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
- * xine is distributed in the hope that it will be useful,
+ * speaker-test is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
@@ -40,8 +40,9 @@
static char *device = "plughw:0,0"; /* playback device */
static snd_pcm_format_t format = SND_PCM_FORMAT_S16; /* sample format */
-static unsigned int rate = 44100; /* stream rate */
+static unsigned int rate = 48000; /* stream rate */
static unsigned int channels = 1; /* count of channels */
+static unsigned int speaker = 0; /* count of channels */
static unsigned int buffer_time = 500000; /* ring buffer
length in us */
static unsigned int period_time = 100000; /* period time in
us */
static double freq = 440; /* sinusoidal wave
frequency in Hz */
@@ -307,10 +308,9 @@
}
static void help(void) {
- int k;
printf(
- "Usage: latency [OPTION]... [FILE]...\n"
+ "Usage: speaker-test [OPTION]... \n"
"-h,--help help\n"
"-D,--device playback device\n"
"-r,--rate stream rate in Hz\n"
@@ -318,8 +318,9 @@
"-f,--frequency sine wave frequency in Hz\n"
"-b,--buffer ring buffer size in us\n"
"-p,--period period size in us\n"
+ "-s,--speaker single speaker test. Values 1=Left or 2=right\n"
"\n");
-
+#if 0
printf("Recognized sample formats are:");
for (k = 0; k < SND_PCM_FORMAT_LAST; ++k) {
const char *s = snd_pcm_format_name(k);
@@ -328,6 +329,8 @@
}
printf("\n\n");
+#endif
+
}
int main(int argc, char *argv[]) {
@@ -345,6 +348,7 @@
{"frequency", 1, NULL, 'f'},
{"buffer", 1, NULL, 'b'},
{"period", 1, NULL, 'p'},
+ {"speaker", 1, NULL, 's'},
{NULL, 0, NULL, 0 },
};
@@ -357,7 +361,7 @@
while (1) {
int c;
- if ((c = getopt_long(argc, argv, "hD:r:c:f:b:p:m:", long_option, NULL)) < 0)
+ if ((c = getopt_long(argc, argv, "hD:r:c:f:b:p:s:", long_option, NULL)) < 0)
break;
switch (c) {
@@ -392,6 +396,15 @@
period_time = period_time < 1000 ? 1000 : period_time;
period_time = period_time > 1000000 ? 1000000 : period_time;
break;
+ case 's':
+ speaker = atoi(optarg);
+ speaker = speaker < 1 ? 0 : speaker;
+ speaker = speaker > channels ? 0 : speaker;
+ if (speaker==0) {
+ printf("Invalid parameter for -s option.\n");
+ exit(EXIT_FAILURE);
+ }
+ break;
default:
printf("Unknown option '%c'\n", c);
exit(EXIT_FAILURE);
@@ -433,21 +446,30 @@
printf("No enough memory\n");
exit(EXIT_FAILURE);
}
+ if (speaker==0) {
+ while (1) {
- while (1) {
-
- for(chn = 0; chn < channels; chn++) {
- printf(" - %s\n", channel_name[chn]);
+ for(chn = 0; chn < channels; chn++) {
+ printf(" - %s\n", channel_name[chn]);
- err = write_loop(handle, chn, ((rate*5)/period_size), samples);
+ err = write_loop(handle, chn, ((rate*5)/period_size), samples);
- if (err < 0) {
- printf("Transfer failed: %s\n", snd_strerror(err));
- exit(EXIT_FAILURE);
+ if (err < 0) {
+ printf("Transfer failed: %s\n", snd_strerror(err));
+ exit(EXIT_FAILURE);
+ }
}
}
+ } else {
+ printf(" - %s\n", channel_name[speaker-1]);
+ err = write_loop(handle, speaker-1, ((rate*5)/period_size), samples);
+
+ if (err < 0) {
+ printf("Transfer failed: %s\n", snd_strerror(err));
+ }
}
+
free(samples);
snd_pcm_close(handle);