fxotune: Use DAHDI_SPECIFY when opening by integer channel number.
In DAHDI-Linux 2.7 the layout of the /dev/dahdi files changes so that they are grouped by span. When opening channels by number all utilities need to use DAHDI_SPECIFY now. Signed-off-by: Shaun Ruffell <sruffell@digium.com> Signed-off-by: Russ Meyerriecks <rmeyerriecks@digium.com>
This commit is contained in:
parent
2889d6afee
commit
8b493f5ee2
79
fxotune.c
79
fxotune.c
@ -47,7 +47,6 @@ static float sintable[SINE_SAMPLES];
|
|||||||
|
|
||||||
static const float amplitude = 16384.0;
|
static const float amplitude = 16384.0;
|
||||||
|
|
||||||
static char *dahdipath = "/dev/dahdi";
|
|
||||||
static char *configfile = "/etc/fxotune.conf";
|
static char *configfile = "/etc/fxotune.conf";
|
||||||
|
|
||||||
static int audio_dump_fd = -1;
|
static int audio_dump_fd = -1;
|
||||||
@ -913,6 +912,66 @@ retry:
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int channel_is_fxo(int channo)
|
||||||
|
{
|
||||||
|
int res = 0;
|
||||||
|
int fd;
|
||||||
|
const char *CTL_DEV = "/dev/dahdi/ctl";
|
||||||
|
struct dahdi_params params;
|
||||||
|
|
||||||
|
fd = open(CTL_DEV, O_RDWR, 0600);
|
||||||
|
if (-1 == fd) {
|
||||||
|
fprintf(stderr, "Failed to open %s: %s\n",
|
||||||
|
CTL_DEV, strerror(errno));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
params.channo = channo;
|
||||||
|
if (ioctl(fd, DAHDI_GET_PARAMS, ¶ms)) {
|
||||||
|
fprintf(stderr,
|
||||||
|
"%d is not a valid channel number.\n", channo);
|
||||||
|
res = -1;
|
||||||
|
} else if (0 == (__DAHDI_SIG_FXS & params.sigcap)) {
|
||||||
|
fprintf(stderr,
|
||||||
|
"Channel %d is not an FXO port.\n", channo);
|
||||||
|
res = -1;
|
||||||
|
} else if (0 == params.sigtype) {
|
||||||
|
fprintf(stderr,
|
||||||
|
"Cannot run on unconfigured channel %d. Please run dahdi_cfg to configure channels before running fxotune.\n",
|
||||||
|
channo);
|
||||||
|
res = -1;
|
||||||
|
}
|
||||||
|
close(fd);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int channel_open(int channo)
|
||||||
|
{
|
||||||
|
int fd;
|
||||||
|
const char *DEVICE = "/dev/dahdi/channel";
|
||||||
|
|
||||||
|
if (channo > 0) {
|
||||||
|
if (channel_is_fxo(channo))
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
fd = open(DEVICE, O_RDWR, 0600);
|
||||||
|
if (fd < 0) {
|
||||||
|
perror(DEVICE);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ioctl(fd, DAHDI_SPECIFY, &channo) < 0) {
|
||||||
|
perror("DADHI_SPECIFY ioctl failed");
|
||||||
|
close(fd);
|
||||||
|
fd = -1;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
fprintf(stderr,
|
||||||
|
"Specified channel is not a valid channel number");
|
||||||
|
fd = -1;
|
||||||
|
}
|
||||||
|
return fd;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Reads echo register settings from the configuration file and pushes them into
|
* Reads echo register settings from the configuration file and pushes them into
|
||||||
* the appropriate devices
|
* the appropriate devices
|
||||||
@ -969,11 +1028,8 @@ static int do_set(char *configfilename)
|
|||||||
mycoefs.coef7 = mycoef7;
|
mycoefs.coef7 = mycoef7;
|
||||||
mycoefs.coef8 = mycoef8;
|
mycoefs.coef8 = mycoef8;
|
||||||
|
|
||||||
snprintf(completedahdipath, sizeof(completedahdipath), "%s/%d", dahdipath, mydahdi);
|
fd = channel_open(mydahdi);
|
||||||
fd = open(completedahdipath, O_RDWR);
|
|
||||||
|
|
||||||
if (fd < 0) {
|
if (fd < 0) {
|
||||||
fprintf(stdout, "open error on %s: %s\n", completedahdipath, strerror(errno));
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1014,11 +1070,8 @@ static int do_dump(int startdev, char* dialstr, int delayuntilsilence, int silen
|
|||||||
char dahdidev[80] = "";
|
char dahdidev[80] = "";
|
||||||
|
|
||||||
int dahdimodule = startdev;
|
int dahdimodule = startdev;
|
||||||
snprintf(dahdidev, sizeof(dahdidev), "%s/%d", dahdipath, dahdimodule);
|
fd = channel_open(dahdimodule);
|
||||||
|
|
||||||
fd = open(dahdidev, O_RDWR);
|
|
||||||
if (fd < 0) {
|
if (fd < 0) {
|
||||||
fprintf(stdout, "%s absent: %s\n", dahdidev, strerror(errno));
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1060,7 +1113,6 @@ static int do_calibrate(int startdev, int enddev, int calibtype, char* configfil
|
|||||||
int res = 0;
|
int res = 0;
|
||||||
int configfd, fd;
|
int configfd, fd;
|
||||||
int devno = 0;
|
int devno = 0;
|
||||||
char dahdidev[80] = "";
|
|
||||||
struct wctdm_echo_coefs coefs;
|
struct wctdm_echo_coefs coefs;
|
||||||
|
|
||||||
configfd = open(configfile, O_CREAT|O_TRUNC|O_WRONLY, 0666);
|
configfd = open(configfile, O_CREAT|O_TRUNC|O_WRONLY, 0666);
|
||||||
@ -1071,15 +1123,12 @@ static int do_calibrate(int startdev, int enddev, int calibtype, char* configfil
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (devno = startdev; devno <= enddev; devno++) {
|
for (devno = startdev; devno <= enddev; devno++) {
|
||||||
snprintf(dahdidev, sizeof(dahdidev), "%s/%d", dahdipath, devno);
|
fd = channel_open(devno);
|
||||||
|
|
||||||
fd = open(dahdidev, O_RDWR);
|
|
||||||
if (fd < 0) {
|
if (fd < 0) {
|
||||||
fprintf(stdout, "%s absent: %s\n", dahdidev, strerror(errno));
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
fprintf(stdout, "Tuning module %s\n", dahdidev);
|
fprintf(stdout, "Tuning module %d\n", devno);
|
||||||
|
|
||||||
if (1 == calibtype)
|
if (1 == calibtype)
|
||||||
res = acim_tune(fd, dialstr, delayuntilsilence, silencegoodfor, &coefs);
|
res = acim_tune(fd, dialstr, delayuntilsilence, silencegoodfor, &coefs);
|
||||||
|
Loading…
Reference in New Issue
Block a user