Недавно я приобрел E-MU 0404 USB, так что, возможно, мой опыт работы с ним поможет вам.
После некоторой борьбы он, кажется, способен воспроизводить и 44100 Гц, и 48000 Гц (и, возможно - но я не проверял - различные частоты вплоть до 192 кГц...)
GStreamer способен выполнять преобразование частоты дискретизации, но это, вероятно, не совсем правильное место для настройки. Как вы, несомненно, заметили, способы настройки невероятно запутаны и, скорее всего, связаны с gconf. Тем не менее, есть несколько других мест, которые должны работать. Я перечислил их в порядке убывания предпочтений.
Хитрость с этими устройствами заключается в установке ползунка 'Clock Rate' в микшере (в alsamixer на базе терминала он должен просто отображаться, я думаю, что другие требуют, чтобы вы убрали ползунок). Установка значения 0 дает 44100 Гц, 1 - 48000 Гц и так далее. Раздражает - но работает.
Примечание: Если вы хотите использовать выход SPDIF, вам нужно настроить медиаплеер на вывод с устройства 1. Если кто-то пытается получить сквозное воспроизведение (AC3/DTS), это не сработает, если только частота дискретизации не установлена правильно (обычно это 48000 кГц, ака "1").
На данный момент все должно работать, ниже говорится о том, как сделать все без возиться с этим ползунком:
Если вы действительно хотите сделать преобразование частоты дискретизации, вы должны быть в состоянии получить желаемый эффект, создав соответствующий ~/.asoundrc (это предполагает, что E-MU является вторым звуковым устройством - вы можете проверить с помощью aplay -l). Следующий вариант не проверен, так как у меня нет под рукой аналоговых кабелей:
pcm.!default {
card 1
device 0
rate 48000
}
ctl.!default {
type hw
card 1
}
Настройка через ALSA должна заставить всё работать, однако, если вы предпочитаете настраивать через PulseAudio, отредактируйте /etc/pulse/daemon.conf и убедитесь, что строка default-sample-rate имеет следующий вид (убедитесь, что она не закомментирована символом ';' и число правильное):
default-sample-rate = 48000
(from https://wiki.archlinux.org/index.php/PulseAudio#Choppy.2C_overdriven_sound )
Вот решение только для bash (другие исполняемые файлы не используются):
while read X; do read Y <&3; echo $((X + Y)); done <file1 3<file2
Здесь file1
перенаправляется на стандартный ввод, а file2
перенаправляется на произвольный дескриптор файла, 3.
Затем while считывает строки из file1
в X
и для каждой итерации явно считывает строку из файлового дескриптора 3 (file2
), а затем выполняет вычисления с использованием арифметики оболочки.
Хорошо, это немного загадочно, но также с арифметикой bash, paste
и sed
.
$ # debug
$ paste -d+ <(sed 's/\(.*\)/echo $((\1/' file1) <(sed 's/\(.*\)/\1))/' file2)
echo $((1+6))
echo $((2+7))
echo $((3+8))
echo $((4+9))
echo $((5+10))
$ eval "$(paste -d+ <(sed 's/\(.*\)/echo $((\1/' file1) <(sed 's/\(.*\)/\1))/' file2))"
7
9
11
13
15
единственное решениеawk
-
awk '(getline a <"file2") <= 0 {exit}; {print $0 + a}' file1
Слишком сложно Только Bash решение
для файла /tmp/file1
1
2
3
4
5
и /tmp/file2
6
7
8
9
10
напишите следующее script.sh
#!/bin/bash
# counters
n=0
m=0
i=0
# read every line from the first file
while read line1;
do
declare firstfile[$n]=$line1
n=$((n+1))
done <$1
# read every line from the second file
while read line2;
do
declare secondfile[$m]=$line2
m=$((m+1))
done <$2
# combine them with arithemtic
while read foo;
do
num=$((${firstfile[$i]} + ${secondfile[$i]}))
echo $num
i=$((i+1))
done <$1
и выполнить его
#:~$ bash script.sh /tmp/file1 /tmp/file2
7
9
11
13
15