📄 rme96xx
字号:
Beta release of the rme96xx (driver for RME 96XX cards like the "Hammerfall" and the "Hammerfall light") Important: The driver module has to be installed on a freshly rebooted system, otherwise the driver might not be able to acquire its buffers.features: - OSS programming interface (i.e. runs with standard OSS soundsoftware) - OSS/Multichannel interface (OSS multichannel is done by just aquiring more than 2 channels). The driver does not use more than one device ( yet .. this feature may be implemented later ) - more than one RME card supportedThe driver uses a specific multichannel interface, which I will documentwhen the driver gets stable. (take a look at the defines in rme96xx.h,which adds blocked multichannel formats i.e instead of lrlrlrlr --> llllrrrr etc.Use the "rmectrl" programm to look at the status of the card .. or use xrmectrl, a GUI interface for the ctrl program.What you can do with the rmectrl program is to set the stereo device forOSS emulation (e.g. if you use SPDIF out).You do:./ctrl offset 24 24which makes the stereo device use channels 25 and 26.Guenter Geiger <geiger@epy.co.at>copy the first part of the attached source code into rmectrl.cand the second part into xrmectrl (or get the program fromhttp://gige.xdv.org/pages/soft/pages/rme)to compile: gcc -o rmectrl rmectrl.c------------------------------ snip ------------------------------------#include <stdio.h>#include <sys/types.h>#include <sys/stat.h>#include <sys/ioctl.h>#include <fcntl.h>#include <linux/soundcard.h>#include <math.h>#include <unistd.h>#include <stdlib.h>#include "rme96xx.h"/* remctrl.c (C) 2000 Guenter Geiger <geiger@debian.org> HP20020201 - Heiko Purnhagen <purnhage@tnt.uni-hannover.de>*//* # define DEVICE_NAME "/dev/mixer" */# define DEVICE_NAME "/dev/mixer1"void usage(void){ fprintf(stderr,"usage: rmectrl [/dev/mixer<n>] [command [options]]\n\n"); fprintf(stderr,"where command is one of:\n"); fprintf(stderr," help show this help\n"); fprintf(stderr," status show status bits\n"); fprintf(stderr," control show control bits\n"); fprintf(stderr," mix show mixer/offset status\n"); fprintf(stderr," master <n> set sync master\n"); fprintf(stderr," pro <n> set spdif out pro\n"); fprintf(stderr," emphasis <n> set spdif out emphasis\n"); fprintf(stderr," dolby <n> set spdif out no audio\n"); fprintf(stderr," optout <n> set spdif out optical\n"); fprintf(stderr," wordclock <n> set sync wordclock\n"); fprintf(stderr," spdifin <n> set spdif in (0=optical,1=coax,2=intern)\n"); fprintf(stderr," syncref <n> set sync source (0=ADAT1,1=ADAT2,2=ADAT3,3=SPDIF)\n"); fprintf(stderr," adat1cd <n> set ADAT1 on internal CD\n"); fprintf(stderr," offset <devnr> <in> <out> set dev (0..3) offset (0..25)\n"); exit(-1);}int main(int argc, char* argv[]){ int cards; int ret; int i; double ft; int fd, fdwr; int param,orig; rme_status_t stat; rme_ctrl_t ctrl; char *device; int argidx; if (argc < 2) usage(); if (*argv[1]=='/') { device = argv[1]; argidx = 2; } else { device = DEVICE_NAME; argidx = 1; } fprintf(stdout,"mixer device %s\n",device); if ((fd = open(device,O_RDONLY)) < 0) { fprintf(stdout,"opening device failed\n"); exit(-1); } if ((fdwr = open(device,O_WRONLY)) < 0) { fprintf(stdout,"opening device failed\n"); exit(-1); } if (argc < argidx+1) usage(); if (!strcmp(argv[argidx],"help")) usage(); if (!strcmp(argv[argidx],"-h")) usage(); if (!strcmp(argv[argidx],"--help")) usage(); if (!strcmp(argv[argidx],"status")) { ioctl(fd,SOUND_MIXER_PRIVATE2,&stat); fprintf(stdout,"stat.irq %d\n",stat.irq); fprintf(stdout,"stat.lockmask %d\n",stat.lockmask); fprintf(stdout,"stat.sr48 %d\n",stat.sr48); fprintf(stdout,"stat.wclock %d\n",stat.wclock); fprintf(stdout,"stat.bufpoint %d\n",stat.bufpoint); fprintf(stdout,"stat.syncmask %d\n",stat.syncmask); fprintf(stdout,"stat.doublespeed %d\n",stat.doublespeed); fprintf(stdout,"stat.tc_busy %d\n",stat.tc_busy); fprintf(stdout,"stat.tc_out %d\n",stat.tc_out); fprintf(stdout,"stat.crystalrate %d (0=64k 3=96k 4=88.2k 5=48k 6=44.1k 7=32k)\n",stat.crystalrate); fprintf(stdout,"stat.spdif_error %d\n",stat.spdif_error); fprintf(stdout,"stat.bufid %d\n",stat.bufid); fprintf(stdout,"stat.tc_valid %d\n",stat.tc_valid); exit (0); } if (!strcmp(argv[argidx],"control")) { ioctl(fd,SOUND_MIXER_PRIVATE3,&ctrl); fprintf(stdout,"ctrl.start %d\n",ctrl.start); fprintf(stdout,"ctrl.latency %d (0=64 .. 7=8192)\n",ctrl.latency); fprintf(stdout,"ctrl.master %d\n",ctrl.master); fprintf(stdout,"ctrl.ie %d\n",ctrl.ie); fprintf(stdout,"ctrl.sr48 %d\n",ctrl.sr48); fprintf(stdout,"ctrl.spare %d\n",ctrl.spare); fprintf(stdout,"ctrl.doublespeed %d\n",ctrl.doublespeed); fprintf(stdout,"ctrl.pro %d\n",ctrl.pro); fprintf(stdout,"ctrl.emphasis %d\n",ctrl.emphasis); fprintf(stdout,"ctrl.dolby %d\n",ctrl.dolby); fprintf(stdout,"ctrl.opt_out %d\n",ctrl.opt_out); fprintf(stdout,"ctrl.wordclock %d\n",ctrl.wordclock); fprintf(stdout,"ctrl.spdif_in %d (0=optical,1=coax,2=intern)\n",ctrl.spdif_in); fprintf(stdout,"ctrl.sync_ref %d (0=ADAT1,1=ADAT2,2=ADAT3,3=SPDIF)\n",ctrl.sync_ref); fprintf(stdout,"ctrl.spdif_reset %d\n",ctrl.spdif_reset); fprintf(stdout,"ctrl.spdif_select %d\n",ctrl.spdif_select); fprintf(stdout,"ctrl.spdif_clock %d\n",ctrl.spdif_clock); fprintf(stdout,"ctrl.spdif_write %d\n",ctrl.spdif_write); fprintf(stdout,"ctrl.adat1_cd %d\n",ctrl.adat1_cd); exit (0); } if (!strcmp(argv[argidx],"mix")) { rme_mixer mix; int i; for (i=0; i<4; i++) { mix.devnr = i; ioctl(fd,SOUND_MIXER_PRIVATE1,&mix); if (mix.devnr == i) { fprintf(stdout,"devnr %d\n",mix.devnr); fprintf(stdout,"mix.i_offset %2d (0-25)\n",mix.i_offset); fprintf(stdout,"mix.o_offset %2d (0-25)\n",mix.o_offset); } } exit (0); }/* the control flags */ if (argc < argidx+2) usage(); if (!strcmp(argv[argidx],"master")) { int val = atoi(argv[argidx+1]); ioctl(fd,SOUND_MIXER_PRIVATE3,&ctrl); printf("master = %d\n",val); ctrl.master = val; ioctl(fdwr,SOUND_MIXER_PRIVATE3,&ctrl); exit (0); } if (!strcmp(argv[argidx],"pro")) { int val = atoi(argv[argidx+1]); ioctl(fd,SOUND_MIXER_PRIVATE3,&ctrl); printf("pro = %d\n",val); ctrl.pro = val; ioctl(fdwr,SOUND_MIXER_PRIVATE3,&ctrl); exit (0); } if (!strcmp(argv[argidx],"emphasis")) { int val = atoi(argv[argidx+1]); ioctl(fd,SOUND_MIXER_PRIVATE3,&ctrl); printf("emphasis = %d\n",val); ctrl.emphasis = val; ioctl(fdwr,SOUND_MIXER_PRIVATE3,&ctrl); exit (0); } if (!strcmp(argv[argidx],"dolby")) { int val = atoi(argv[argidx+1]); ioctl(fd,SOUND_MIXER_PRIVATE3,&ctrl); printf("dolby = %d\n",val); ctrl.dolby = val; ioctl(fdwr,SOUND_MIXER_PRIVATE3,&ctrl); exit (0); } if (!strcmp(argv[argidx],"optout")) { int val = atoi(argv[argidx+1]); ioctl(fd,SOUND_MIXER_PRIVATE3,&ctrl); printf("optout = %d\n",val); ctrl.opt_out = val; ioctl(fdwr,SOUND_MIXER_PRIVATE3,&ctrl); exit (0); } if (!strcmp(argv[argidx],"wordclock")) { int val = atoi(argv[argidx+1]); ioctl(fd,SOUND_MIXER_PRIVATE3,&ctrl); printf("wordclock = %d\n",val); ctrl.wordclock = val; ioctl(fdwr,SOUND_MIXER_PRIVATE3,&ctrl); exit (0); } if (!strcmp(argv[argidx],"spdifin")) { int val = atoi(argv[argidx+1]); ioctl(fd,SOUND_MIXER_PRIVATE3,&ctrl); printf("spdifin = %d\n",val); ctrl.spdif_in = val; ioctl(fdwr,SOUND_MIXER_PRIVATE3,&ctrl); exit (0); } if (!strcmp(argv[argidx],"syncref")) { int val = atoi(argv[argidx+1]); ioctl(fd,SOUND_MIXER_PRIVATE3,&ctrl); printf("syncref = %d\n",val); ctrl.sync_ref = val; ioctl(fdwr,SOUND_MIXER_PRIVATE3,&ctrl); exit (0); } if (!strcmp(argv[argidx],"adat1cd")) { int val = atoi(argv[argidx+1]); ioctl(fd,SOUND_MIXER_PRIVATE3,&ctrl); printf("adat1cd = %d\n",val); ctrl.adat1_cd = val; ioctl(fdwr,SOUND_MIXER_PRIVATE3,&ctrl); exit (0); }/* setting offset */ if (argc < argidx+4) usage(); if (!strcmp(argv[argidx],"offset")) { rme_mixer mix; mix.devnr = atoi(argv[argidx+1]); mix.i_offset = atoi(argv[argidx+2]); mix.o_offset = atoi(argv[argidx+3]); ioctl(fdwr,SOUND_MIXER_PRIVATE1,&mix); fprintf(stdout,"devnr %d\n",mix.devnr); fprintf(stdout,"mix.i_offset to %d\n",mix.i_offset); fprintf(stdout,"mix.o_offset to %d\n",mix.o_offset); exit (0); } usage(); exit (0); /* to avoid warning */}---------------------------- <snip> --------------------------------#!/usr/bin/wish# xrmectrl# (C) 2000 Guenter Geiger <geiger@debian.org># HP20020201 - Heiko Purnhagen <purnhage@tnt.uni-hannover.de>#set defaults "-relief ridged"set CTRLPROG "./rmectrl"if {$argc} { set CTRLPROG "$CTRLPROG $argv"}puts "CTRLPROG $CTRLPROG"frame .buttsbutton .butts.exit -text "Exit" -command "exit" -relief ridge#button .butts.state -text "State" -command "get_all"pack .butts.exit -side leftpack .butts -side bottom## STATUS#frame .status# Sampling Rateframe .status.srlabel .status.sr.text -text "Sampling Rate" -justify leftradiobutton .status.sr.441 -selectcolor red -text "44.1 kHz" -width 10 -anchor nw -variable srate -value 44100 -font timesradiobutton .status.sr.480 -selectcolor red -text "48 kHz" -width 10 -anchor nw -variable srate -value 48000 -font timesradiobutton .status.sr.882 -selectcolor red -text "88.2 kHz" -width 10 -anchor nw -variable srate -value 88200 -font timesradiobutton .status.sr.960 -selectcolor red -text "96 kHz" -width 10 -anchor nw -variable srate -value 96000 -font timespack .status.sr.text .status.sr.441 .status.sr.480 .status.sr.882 .status.sr.960 -side top -padx 3# Lockframe .status.locklabel .status.lock.text -text "Lock" -justify leftcheckbutton .status.lock.adat1 -selectcolor red -text "ADAT1" -anchor nw -width 10 -variable adatlock1 -font timescheckbutton .status.lock.adat2 -selectcolor red -text "ADAT2" -anchor nw -width 10 -variable adatlock2 -font timescheckbutton .status.lock.adat3 -selectcolor red -text "ADAT3" -anchor nw -width 10 -variable adatlock3 -font timespack .status.lock.text .status.lock.adat1 .status.lock.adat2 .status.lock.adat3 -side top -padx 3 # Syncframe .status.synclabel .status.sync.text -text "Sync" -justify leftcheckbutton .status.sync.adat1 -selectcolor red -text "ADAT1" -anchor nw -width 10 -variable adatsync1 -font timescheckbutton .status.sync.adat2 -selectcolor red -text "ADAT2" -anchor nw -width 10 -variable adatsync2 -font timescheckbutton .status.sync.adat3 -selectcolor red -text "ADAT3" -anchor nw -width 10 -variable adatsync3 -font timespack .status.sync.text .status.sync.adat1 .status.sync.adat2 .status.sync.adat3 -side top -padx 3 # Timecodeframe .status.tclabel .status.tc.text -text "Timecode" -justify leftcheckbutton .status.tc.busy -selectcolor red -text "busy" -anchor nw -width 10 -variable tcbusy -font timescheckbutton .status.tc.out -selectcolor red -text "out" -anchor nw -width 10 -variable tcout -font timescheckbutton .status.tc.valid -selectcolor red -text "valid" -anchor nw -width 10 -variable tcvalid -font timespack .status.tc.text .status.tc.busy .status.tc.out .status.tc.valid -side top -padx 3 # SPDIF Inframe .status.spdiflabel .status.spdif.text -text "SPDIF In" -justify leftlabel .status.spdif.sr -text "--.- kHz" -anchor n -width 10 -font timescheckbutton .status.spdif.error -selectcolor red -text "Input Lock" -anchor nw -width 10 -variable spdiferr -font timespack .status.spdif.text .status.spdif.sr .status.spdif.error -side top -padx 3 pack .status.sr .status.lock .status.sync .status.tc .status.spdif -side left -fill x -anchor n -expand 1## CONTROL #proc setprof {} { global CTRLPROG
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -