mirror of
https://github.com/alsa-project/alsa-tools.git
synced 2025-11-02 09:01:48 -05:00
Added sscape_ctl tool
This commit is contained in:
parent
11080289c7
commit
c053a5cffc
5 changed files with 312 additions and 1 deletions
2
Makefile
2
Makefile
|
|
@ -1,6 +1,6 @@
|
||||||
VERSION = 0.9.0rc1
|
VERSION = 0.9.0rc1
|
||||||
TOP = .
|
TOP = .
|
||||||
SUBDIRS = ac3dec as10k1 envy24control sb16_csp seq
|
SUBDIRS = ac3dec as10k1 envy24control sb16_csp seq sscape_ctl
|
||||||
|
|
||||||
all:
|
all:
|
||||||
@for i in $(SUBDIRS); do cd $(TOP)/$$i; ./cvscompile; cd ..; make -C $$i; done
|
@for i in $(SUBDIRS); do cd $(TOP)/$$i; ./cvscompile; cd ..; make -C $$i; done
|
||||||
|
|
|
||||||
14
sscape_ctl/Makefile.am
Normal file
14
sscape_ctl/Makefile.am
Normal file
|
|
@ -0,0 +1,14 @@
|
||||||
|
# # Process this file with automake to produce Makefile.in.
|
||||||
|
AUTOMAKE_OPTIONS = 1.3 foreign
|
||||||
|
|
||||||
|
CFLAGS = -Wall -g
|
||||||
|
|
||||||
|
bin_PROGRAMS = sscape_ctl
|
||||||
|
|
||||||
|
sscape_ctl_SOURCES = sscape_ctl.c
|
||||||
|
|
||||||
|
alsa-dist: distdir
|
||||||
|
@rm -rf ../distdir/sscape_ctl
|
||||||
|
@mkdir -p ../distdir/sscape_ctl
|
||||||
|
@cp -RLpv $(distdir)/* ../distdir/sscape_ctl
|
||||||
|
@rm -rf $(distdir)
|
||||||
52
sscape_ctl/configure.in
Normal file
52
sscape_ctl/configure.in
Normal file
|
|
@ -0,0 +1,52 @@
|
||||||
|
AC_INIT(sscape_ctl.c)
|
||||||
|
AM_INIT_AUTOMAKE(sscape_ctl, 0.1.0)
|
||||||
|
AC_PROG_CC
|
||||||
|
AC_PROG_INSTALL
|
||||||
|
AC_HEADER_STDC
|
||||||
|
AM_PATH_ALSA(0.9.0)
|
||||||
|
|
||||||
|
dnl kernel header files
|
||||||
|
AC_MSG_CHECKING(for kernel header files)
|
||||||
|
AC_ARG_WITH(kernel,
|
||||||
|
[ --with-kernel=ver specify kernel version (for example 2.5.5-pre1)],
|
||||||
|
[kerneldir="$withval"], [kerneldir=""])
|
||||||
|
if test "$kerneldir" != "" -a -r "/lib/modules/$kerneldir/build/include/sound"; then
|
||||||
|
kerneldir="/lib/modules/$kerneldir/build/include"
|
||||||
|
AC_MSG_RESULT($kerneldir)
|
||||||
|
else
|
||||||
|
if test -z "$kerneldir"; then
|
||||||
|
AC_MSG_RESULT("not specified")
|
||||||
|
else
|
||||||
|
AC_MSG_RESULT("directory /lib/modules/$kerneldir/build/include/sound not found")
|
||||||
|
fi
|
||||||
|
kerneldir=""
|
||||||
|
fi
|
||||||
|
|
||||||
|
dnl path for sound/asound.h
|
||||||
|
AC_MSG_CHECKING(for directory with ALSA kernel headers)
|
||||||
|
AC_ARG_WITH(soundbase,
|
||||||
|
[ --with-soundbase=dir specify base directory with kernel sound headers (optional)],
|
||||||
|
[soundbasedir="$withval"], [soundbasedir="$kerneldir"])
|
||||||
|
if test "$soundbasedir" != "" -a -r "$soundbasedir/sound" ; then
|
||||||
|
ALSA_CFLAGS="$ALSA_CFLAGS -I$soundbasedir"
|
||||||
|
CFLAGS="$CFLAGS -I$soundbasedir"
|
||||||
|
AC_MSG_RESULT($ALSA_CFLAGS)
|
||||||
|
else
|
||||||
|
if test "x$prefix" != xNONE; then
|
||||||
|
aprefix=$prefix
|
||||||
|
else
|
||||||
|
aprefix=$ac_default_prefix
|
||||||
|
fi
|
||||||
|
if test -z "$soundbasedir" -a -r "$aprefix/include/sound"; then
|
||||||
|
ALSA_CFLAGS="$ALSA_CFLAGS -I$aprefix/include"
|
||||||
|
CFLAGS="$CFLAGS -I$aprefix/include"
|
||||||
|
AC_MSG_RESULT($ALSA_CFLAGS)
|
||||||
|
else
|
||||||
|
AC_MSG_RESULT("not specified - using C compilator defaults")
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
CFLAGS="$CFLAGS $ALSA_FLAGS"
|
||||||
|
LDFLAGS="$LDFLAGS $ALSA_LIBS"
|
||||||
|
|
||||||
|
AC_OUTPUT(Makefile)
|
||||||
24
sscape_ctl/cvscompile
Normal file
24
sscape_ctl/cvscompile
Normal file
|
|
@ -0,0 +1,24 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
if test "x$AUTOMAKE_DIR" = "x"; then
|
||||||
|
if test -d /usr/local/share/automake; then
|
||||||
|
AUTOMAKE_DIR=/usr/local/share/automake
|
||||||
|
fi
|
||||||
|
if test -d /usr/share/automake; then
|
||||||
|
AUTOMAKE_DIR="/usr/share/automake"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
for f in install-sh mkinstalldirs missing; do
|
||||||
|
cp -av $AUTOMAKE_DIR/$f .
|
||||||
|
done
|
||||||
|
|
||||||
|
aclocal $ACLOCAL_FLAGS
|
||||||
|
automake --foreign --add-missing
|
||||||
|
autoconf
|
||||||
|
export CFLAGS='-O2 -Wall -pipe -g'
|
||||||
|
echo "CFLAGS=$CFLAGS"
|
||||||
|
echo "./configure $@"
|
||||||
|
./configure $@
|
||||||
|
unset CFLAGS
|
||||||
|
make
|
||||||
221
sscape_ctl/sscape_ctl.c
Normal file
221
sscape_ctl/sscape_ctl.c
Normal file
|
|
@ -0,0 +1,221 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <getopt.h>
|
||||||
|
#include <sys/ioctl.h>
|
||||||
|
|
||||||
|
#include <sound/sscape_ioctl.h>
|
||||||
|
#include <alsa/asoundlib.h>
|
||||||
|
|
||||||
|
|
||||||
|
const char default_dir[] = "/sndscape";
|
||||||
|
const char scope[] = "scope.cod";
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
safe_close(int fd)
|
||||||
|
{
|
||||||
|
int err;
|
||||||
|
while (((err = close(fd)) != 0) && (errno == EINTR)) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t
|
||||||
|
get_directory(const char *dir, char *buffer, size_t bufsize)
|
||||||
|
{
|
||||||
|
size_t len;
|
||||||
|
|
||||||
|
len = snprintf(buffer, bufsize, "%s/", dir);
|
||||||
|
if (len >= bufsize)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if ((len > 1) && (buffer[len - 1] == '/') && (buffer[len - 2] == '/'))
|
||||||
|
{
|
||||||
|
buffer[--len] = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
return len;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
size_t
|
||||||
|
get_bootfile(const char *filename, char *buffer, size_t bufsize)
|
||||||
|
{
|
||||||
|
size_t len = snprintf(buffer, bufsize, "%s", filename);
|
||||||
|
if (len >= bufsize)
|
||||||
|
return 0;
|
||||||
|
return len;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
size_t
|
||||||
|
get_mcodefile(unsigned version, char *buffer, size_t bufsize)
|
||||||
|
{
|
||||||
|
static const char sndscape[] = "sndscape.co%u";
|
||||||
|
|
||||||
|
size_t len = snprintf(buffer, bufsize, sndscape, version);
|
||||||
|
if (len >= bufsize)
|
||||||
|
return 0;
|
||||||
|
return len;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
load_bootblock(const char *fname, struct sscape_bootblock *boot)
|
||||||
|
{
|
||||||
|
int err;
|
||||||
|
int fd;
|
||||||
|
|
||||||
|
printf("Bootblock: %s\n", fname);
|
||||||
|
|
||||||
|
err = fd = open(fname, O_RDONLY);
|
||||||
|
if (err >= 0)
|
||||||
|
{
|
||||||
|
int save_errno;
|
||||||
|
|
||||||
|
err = read(fd, boot->code, sizeof(boot->code));
|
||||||
|
if (err >= 0)
|
||||||
|
{
|
||||||
|
printf("Bootblock: read %d bytes\n", err);
|
||||||
|
err = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
save_errno = errno;
|
||||||
|
safe_close(fd);
|
||||||
|
errno = save_errno;
|
||||||
|
}
|
||||||
|
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
load_microcode(const char *fname, struct sscape_microcode *microcode)
|
||||||
|
{
|
||||||
|
int err;
|
||||||
|
int fd;
|
||||||
|
|
||||||
|
printf("Microcode: %s\n", fname);
|
||||||
|
|
||||||
|
err = fd = open(fname, O_RDONLY);
|
||||||
|
if (err >= 0)
|
||||||
|
{
|
||||||
|
int save_errno;
|
||||||
|
|
||||||
|
err = read(fd, microcode->code, sizeof(microcode->code));
|
||||||
|
if (err >= 0)
|
||||||
|
{
|
||||||
|
printf("Microcode: read %d bytes\n", err);
|
||||||
|
err = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
save_errno = errno;
|
||||||
|
safe_close(fd);
|
||||||
|
errno = save_errno;
|
||||||
|
}
|
||||||
|
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const struct option long_option[] = {
|
||||||
|
{ "card", 1, NULL, 'c' },
|
||||||
|
{ "directory", 1, NULL, 'd' },
|
||||||
|
{ NULL, 0, NULL, '\0' }
|
||||||
|
};
|
||||||
|
|
||||||
|
static const char option[] = "c:d:";
|
||||||
|
|
||||||
|
int
|
||||||
|
main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
char devicename[32];
|
||||||
|
int ret, err;
|
||||||
|
snd_hwdep_t *handle;
|
||||||
|
|
||||||
|
const char *directory = default_dir;
|
||||||
|
int card = 0;
|
||||||
|
|
||||||
|
int oindex;
|
||||||
|
int c;
|
||||||
|
|
||||||
|
while ( (c = getopt_long(argc, argv, option, long_option, &oindex)) != EOF )
|
||||||
|
{
|
||||||
|
switch(c)
|
||||||
|
{
|
||||||
|
case 'c':
|
||||||
|
card = snd_card_get_index(optarg);
|
||||||
|
if (card < 0 || card > 31) {
|
||||||
|
fprintf(stderr, "Wrong -c argument '%s'\n", optarg);
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'd':
|
||||||
|
directory = optarg;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
fprintf(stderr, "Unknown option \'%c\'\n", c);
|
||||||
|
break;
|
||||||
|
} /* switch */
|
||||||
|
} /* while */
|
||||||
|
|
||||||
|
ret = EXIT_FAILURE;
|
||||||
|
sprintf(devicename, "hw:%i,0", card);
|
||||||
|
err = snd_hwdep_open(&handle, devicename, O_WRONLY);
|
||||||
|
if (err < 0)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Error opening %s: %s\n", devicename, snd_strerror(err));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
char filename[FILENAME_MAX];
|
||||||
|
size_t len;
|
||||||
|
|
||||||
|
struct sscape_bootblock boot;
|
||||||
|
struct sscape_microcode microcode;
|
||||||
|
|
||||||
|
if ((len = get_directory(directory, filename, sizeof(filename))) == 0)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Invalid directory - pathname too long\n");
|
||||||
|
}
|
||||||
|
else if (get_bootfile(scope, filename + len, sizeof(filename) - len) == 0)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Invalid filename - full pathname too long\n");
|
||||||
|
}
|
||||||
|
else if (load_bootblock(filename, &boot) < 0)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Failed to load file [%s]: %s\n",
|
||||||
|
filename, strerror(errno));
|
||||||
|
}
|
||||||
|
else if (snd_hwdep_ioctl(handle, SND_SSCAPE_LOAD_BOOTB, &boot) < 0)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "IOCTL error: %s\n", strerror(errno));
|
||||||
|
}
|
||||||
|
else if (get_mcodefile(boot.version & 0x0f,
|
||||||
|
filename + len, sizeof(filename) - len) == 0)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Invalid filename - full pathname too long\n");
|
||||||
|
}
|
||||||
|
else if (load_microcode(filename, µcode) < 0)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Failed to load microcode [%s]\n", filename);
|
||||||
|
}
|
||||||
|
else if (snd_hwdep_ioctl(handle, SND_SSCAPE_LOAD_MCODE, µcode) < 0)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "IOCTL error: %s\n", strerror(errno));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
printf("Microcode loaded.\n");
|
||||||
|
ret = EXIT_SUCCESS;
|
||||||
|
}
|
||||||
|
snd_hwdep_close(handle);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue