переключение аудио в linux Trendnet USB-KVM Switcher

Как водится в обществе потребления, главное продать. Кто основные клиенты? Виндузятники. Вот для них и будем делать софт и драйвера. А для остальных не будем. А хули они линуксоиды? Сами виноваты!

Попробовал снифать usb. Он там передает какой-то bulk пакет на hid устройство, в одном случае число 4 в другом 5. Готовых исходников как посылать bulk пакеты я не нагуглил, а изучать все это дело лень, да и может не заработать.

Решил поступить как обычно: автоматизировать Windows форму с помощью Autoit. Благо на одном компе у меня стоит винда. А вот тем у кого нет винды ни на одном компьютере подключенном к kvm свичу — тем мой способ не подойдет. Разве только смогут пробросить это hid устройство в виртуалку с виндой (если это вообще не клавиатура или мышь).

Вот так выглядит приложение.

Image

Написано на стандартной библиотеке, так что мышкокликательством заниматься не придется, что уже хорошо. Увы я не смог никак сделать, что-бы окно не перехватывало фокус. И скрыть окно я смог только выставив прозрачность в 255 — @SW_HIDE не работал. Но в общем вроде пригодно для использования.

#NoAppIcon

$title = «Trendnet USB-KVM Switcher» ; title of trendnet kvm window
$path = «C:\Program Files (x86)\Trendnet\USBKVM Switcher\USBKVM.exe» ; path to program file
if $CmdLine[0] = 0 Then
MsgBox(16,»Options», «Options:» & @CRLF & @ScriptName & » 1|2|3|4|disable»)
Exit
EndIf

$ActiveWindow = WinGetHandle(«»)

if Not WinExists($title) Then ;if app not started — start it
Run($path)
WinWait($title)
EndIf

WinSetTrans($title, «», 0) ; hide window, could not found better way
Run($path) ;activate window, cant do WinSetState, because somehow it dont work 😦
WinActivate($ActiveWindow) ;return focus — first blink
WinSetState($title,»»,@SW_SHOWNOACTIVATE)
if $CmdLine[1] = «disable» Then
ControlCommand($title,»», «[Class:Button; INSTANCE:8]», «Uncheck», «» )
Else
ControlCommand($title,»», «[Class:Button; INSTANCE:8]», «Check», «» )
ControlCommand($title,»», «[Class:ComboBox; INSTANCE:1]», «SelectString», $CmdLine[1] )
EndIf
While BitAND(WinGetState($title), 2) ;because OK button does not appear right after window is shown
ControlClick ( $title, «»,»[CLASS:Button; INSTANCE:1]»)
WEnd
WinActivate($ActiveWindow) ;return focus again — second blink (blinks only when switching is done indeed, not the same pc)
WinSetTrans($title, «», 255) ; return to make utility usable by human

После данной разработки появилась возможность управлять переключением звука хоткеями из винды (только надо настроить глобальный хоткей сторонним софтом).  Ну а из линукса оно будет запускаться по ssh (он у меня для других целей стоял). Но можно и через веб сервер такое сделать (опять же смотря, что уже настроено)

kvm switch в линуксе

Купил недавно trendnet tk-204uk. Вообще он переключается по двойному нажатию scroll lock. В линуксе надо нажимать num lock. Но ни то ни другое у меня не работало в линуксе. Scroll lock просто не функционировал, а num lock изменял лампочку, но ничего не перелючалось.

Как я узнал ранее, kvm свичи смотрят на изменение лампочки а не на само нажатие. Немного погуглив я написал решение проблемы. В настройках xfce создал хоткей scrolllock и настроил его на запуск программы ниже.

Программа определяет состояние лампочки и переключает в противоположное. Если переключается не та лампочка измените цифру 4 в данной строчке «if (x.led_mask & 4) {»

https://github.com/POMATu/kvm-switcher

 

#include <stdio.h>
#include <X11/Xlib.h>

int main(void) {

Display *dpy = XOpenDisplay(«:0»);
XKeyboardState x;
XGetKeyboardControl(dpy, &x);
XCloseDisplay(dpy);
// printf(«led_mask=%lx\n», x.led_mask);
if (x.led_mask & 4) {
system(«xset -led named \»Scroll Lock\»»);
} else {
system(«xset led named \»Scroll Lock\»»);
}
printf(«%s\n», (x.led_mask & 4) ? «on» : «off»);
return 0;
}

VirtualBox & usb support

Наонец я разобрался почему в арче полный виртуалбокс тормозит и глючит. Дело в том, что если ставить версию из репозитария, то ставиться версия OSE (опенсорсная, но без поддержки usb). А  если ставить из аура (virtualbox_bin) то ставится полная версия, со скриптом vbox_build_module который видимо глючный, так как модули шары фс и host-network (не NAT) не грузятся. Наконец я нашел решение — скомпилить пакет из аура, но не собирать модули скриптом, а поставить модули из репозитария (virtualbox-modules). В результате все работает прекрасно!

Как это сделать:

ln -s /etc/rc.d /etc/init.d

сделайте это на будущее — жить легче будет (:

yaourt -S virtualbox_bin virtualbox-modules virtualbox-additions

компилим сам виртуалбокс, ставим модули из репозитария, и ставим образ аддишнов из репозитария

Далее засовываем в секцию модулей в rc.conf нудные модули: vboxdrv vboxnetflt

Подгружаем их руками, или перезагружеемся…

Все! Виртуалбокс полностью функционирует!

VirtualBoyAdvance [link support]

VirtualBoy — лучший эмулятор моей любимой консоли gba. Но вот проблемма, игры в нем идут как-то через задницу. Все исправляет добавления файла vba-over.ini в папку с программой.

vba-over.ini:

http://www.no-intro.org/gbadat/tools/vbaother_20051224.zip

vba-link:

http://www.vbalink.info/download/vbalink172l.zip

kres-migrator

Мне порядком надоело искать инфу про то, как убирать окно kres-migrator’а при запуске kde4, поэтому запостю комманду сюда:

kwriteconfig —file kres-migratorrc —group Migration —key Enabled —type bool false

Jabber Shell Bot — теперь поддерживает русский

Есть много видов удаленного администрирования. Многие предпочитают граффику (vnc, rdp), многие старую добрую тру-консоль (sshd, telnetd). Но а если все эти навороченные сервера удаленного управления упали? Ничего не работает, никак не поднять, а файлы получить срочно нужно. Тогда спасает jabber shell bot. Казалось бы что за ненужная вещь по сравнению с теме ssh? Да вот только именно через него бородатые сисадмины зачастую и перезапускают ssh.

Теперь к делу:

jabber shell bot требует устанновленного perl’а.

Устанавливаем perl:

pacman -Sy perl

Скрипт требует библиотеки  Net::XMPP, Net::Jabber, utf8 и Encode. Устанавливаем их через cpan:

cpan

install Net::XMPP

install Net::Jabber

install utf8

install Encode

Вот сам скрипт: http://dpaste.org/E9np/

#!/usr/bin/perl
use strict;
use warnings;
use diagnostics;
use Net::XMPP;
use Net::Jabber;
use utf8;
use Encode;
# Список файлов конфигурации для перебора
my @configs = (
$ENV{'HOME'}.'/.jabber-shell', # Пользовательский файл конфигурации
'/etc/jabber-shell.conf', # Системный конфиг
);
# Хэш для хранения настроек
my %settings;
# Перебираем все файлы конфигурации
foreach my $config (@configs) {
# Если файл существует и доступен для чтения
if ( ( -e $config ) && ( -r $config) ) {
# Читаем конфигурацию
open(CONFIG, '<'.$config);
local $/ = undef;
my $config_data = <CONFIG>;
close(CONFIG);
%settings = eval($config_data);
# Выходим из цикла
last;
}
}
# Если не удалось прочитать настройки - завершаем работу
if (!%settings) {
die("Can't read settings!");
}
# Массив, в котором будут JID админов
my @admins = split(' ', $settings{'admins'});
# Определяем основные перменные
my $client = new Net::Jabber::Client();
my $presense = Net::Jabber::Presence->new();
# Определяем обработчики событий
$client->SetCallBacks(
'message' => \&on_message,
);
# Подключаемся к сети
# TODO: Обрабатывать ошибки подключения
$client->Connect(
'hostname' => $settings{'server'},
'port' => $settings{'port'},
);
my @connect = $client->AuthSend(
'username' => $settings{'username'},
'password' => $settings{'password'},
'resource' => $settings{'resource'},
);
# Устанавливаем статус
$presense->SetType("available");
$presense->SetStatus("");
$client->Send($presense);
# Функция обработки команд
sub process_command {
my $command = shift;
my $message = '';
# Если команда cd - пытаемся сменить директорию
if ($command =~ s/^cd([ ]+)//) {
if (chdir($command)) {
$message = 'Directory changed';
}
else {
$message = 'Directory NOT changed';
}
}
# Если какая-то другая - выполняем её и возвращаем результат
else {
# open(COMMAND, $command." 2>&1 |");
# local $/ = undef;
# $message = <COMMAND>;
# close(COMMAND);
$message = `$command 2>&1`;
$message = decode('utf-8', $message);
}
return $message;
}
# Функция обработки сообщений
sub on_message {
my $mid = shift || return;
my $msg = shift || return;
# Команда, которую будем выполнять
my $command = $msg->GetBody;
# Получаем JID отправителя
my $jid = new Net::XMPP::JID($msg->GetFrom)->GetJID("base");
# Перебираем админов
foreach my $admin (@admins) {
# Если сообщение от одного из них
if ($jid eq $admin) {
# Обрабатываем сообщение и посылаем ответ
my $reply = Net::Jabber::Message->new();
$reply->SetMessage(
'to' => $msg->GetFrom,
'body' => process_command($command),
);
$client->Send($reply);
}
}
}
# Цикл обработки сообщений
while (defined($client->Process)) {
}
# На всякий случай закрываем соединение
$client->Disconnect();

Скрипт настроен на работу с русским языком. Единственная проблемма, что он валится при любых бинарных символах, например: fl.

Конфиг для него должен находиться в пути /etc/jabber-shell.conf и выглядеть так: http://dpaste.org/z1Fu/

(
‘server’   => ‘jabber.org’,       # Сервер для бота
‘port’     => ‘5222’,            # Порт сервера для бота
‘username’ => ‘username’,    # Имя пользователя на сервере
‘password’ => ‘password’,          # Пароль аккаунта бота
‘resource’ => ‘jabber-shell’,    # Ресур бота
‘admins’   => ‘pomatu@jabber.org’, # JID админов
)

Бот заканчивает работу, при первом вылете или дисконнекте, поэтому лучше сделать скрипт такого вида:

#!/bin/bash

while true

do

perl /path/to/perl/file/that/is/written/upper.pl

done

Согласен — это извращенно. Зато практично 🙂

Оффициальный сайт бота (без поддержки русского): http://jabber-shell.ylsoftware.com/

Вот и все на сегодня. Спасибо за чтение. Если вам понравилась статья — прошу оставить коментарий 🙂

Aegisub пакет — или горе компиляции…

Изходя из того, что пакет aegisub не компилится, я решил поискать уже скомпилиный пакет. И я его нашел!

Для того чтобы поставить его надо:

Arch Linux:

Добавить эти строки в конец /etc/pacman.conf:

Для 32-bit:

[ophion]
Server = http://emess.developersatlarge.com/packages/i686/

Для 64-bit:

[ophion-stable]
Server = http://emess.developersatlarge.com/packages/x86_64/stable

Затем запустить:

pacman -Syf ophion-aegisub --noconfirm

При установке будет заменятся пакет ffmpeg на ophion-ffmpeg. Его НАДО! заменить. Если его не заменять, то воспроизводится видео нормально не будет (программа будет зависать после трех секунд.) Если вам беспокоит то что какой-нибудь сраный gstreamer не будет его переваривать — то поставьте наконец mplayer.

Затем следует запустить это

cd /usr/lib

ln -s libopenal.so libopenal.so.0
ln -s libruby.so.1.9 libruby.so.1.8
ln -s libfaad.so.2 libfaad.so.1
ln -s libx264.so.67 libx264.so.65

Потом в самой программе:  Вид->Options->Video. Там нужно изменить «subtitle provider» с «csri» на «libass». Все! Теперь программа прекрасно работает!

Mandriva 2009

Enable the /backports repository and install the ‘aegisubpackage. For details on how to do that see http://wiki.mandriva.com/en/Docs/Basic_tasks/Installing_and_removing_software#Advanced_use:_Backports_and_candidate_updates

Ubuntu:

http://workshop.connor.hu/ubuntu/deb/aegisub/

Аудио конвертер под Linux

Честно говоря, конвертирование чего-либо под линуксом большая проблема для многих людей. Нужно перекапывать кучу манов, а форумы зачастую дают не самое простое решение. Кто-то не хочет тратить свое драгоценное время, или просто нет желания читать очередной унылый мануал на неродном языке. Так или иначе — я нашел замечательный конвертер, который не будет еб*ть мозги, и конвертирует «все во все». Кроме того он позволяет конвертировать рекурсивно.

Поддерживаемые форматы:

aac ac3 aif aiff ape asf au avi avr bonk caf cdr divx fap fla flac flv ircam la lpac m4a m4b m4v mat mat4 mat5 mkv mmf mov mp2 mp3 mp4 mpc mpeg mpg mpp nist nsv nuv ofr ofs ogg ogm pac paf psp pvf qt ra ram raw rm rv sd2 sf shn smk smp snd spx svcd tta vcd vob voc w64 wav wma wmv wv

Тут указаны и видео форматы. Это значит что он без проблем достает из видеофайла звуковую дорожку.

Программа называется pacpl (Perl audio converter):

http://pacpl.sourceforge.net/

Что касается арчеводов, то pacpl лежит в aur’е, и вполне работоспособен, только он какого-то черта тянет за собой kdebase (нужно поправить PKGBUILD).

Бубунта — придержи пакеты

Все-таки придется тут постить и такое уг как бубунту, ибо многие мои знакомы ее и используют. Но ничего, я их всех заставлю перейти на арч, хехе >:-).

Блокируем наш любимый пакет flashplayer от обновления — в репозитарии обновления какой-то глючный пакет.

sudo apt-get install wajig
sudo wajig hold adobe-flashplayer

Собственно наверное вы поняли что wajig можно использовать для блокировки любого пакета. Удачи.

Конвертирование lossless (flac,tta + cue) в mp3

Если у вас есть файл с lossless музыкой (один со всем диском) и cue файл к нему, то этот скрипт поможет его порезать на отдельные, правильно названные (не «track 01», а к примеру «01.Aluminia», короче то, что написано в cue файле) mp3 файлы.

Требуемые пакеты shntool, ttaenc.
Все это присутствует в aur’е.

usage: cue2mp3 MUSIC_FILE [CUE_FILE]

#!/bin/sh
 set -e

ENCODE="cust ext=mp3 lame -b 192 - %f"
FORMAT="%n.%t"

FLACFILE=$1
CUEFILE=$2
echo $FLACFILE - $CUEFILE
if [ -z "$FLACFILE" ]; then
    echo "usage: cue2mp3 MUSIC_FILE [CUE_FILE]"
    exit 1
elif [ -z "$CUEFILE" ]; then
    DIRECTORY=$(dirname "$FLACFILE")
    BASENAME=$(basename "$FLACFILE" ".flac")
    CUEFILE="$DIRECTORY/$BASENAME.cue"
fi

shnsplit -O always -o "$ENCODE" -f "$CUEFILE" -t "$FORMAT" "$FLACFILE"