mellowman, продолжаем разговор....
То, что в vmware все меняется - верю, ты ж не выгружаешь snd-usb-audio, сбрасывается
в 44 именно по команде "modprobe snd-usb-audio".
Ближе к теме:
Используется контрольный endpoint устройства в целом -EP0;
Вот кусок кода, это для kernel-mode:
Код:
int emu_set_samplerate_ExUnit(usb_device *emu0404_dev,__u16 sample_rate){
int ret=0;
__u16 sr_to_set;
if(!emu0404_dev) return -1;
// extern int usb_control_msg(struct usb_device *dev,
// unsigned int pipe, __u8 request,
// __u8 requesttype, __u16 value,
// __u16 index, void *data, __u16 size,
// int timeout);
ret= usb_control_msg(emu0404_dev,usb_rcvctrlpipe(emu0404_dev,0),
0x81,0xA1, 0x0300 ,0x0C00, &sr_to_set, 1, 5000 ); //вычитываем значение samplerate
if(ret < 0)
printk("Get samplerate: FAULT 0x%x\n",0-ret);
else
printk("Get samplerate: SUCCESS: 0x%x\n",sr_to_set);
sr_to_set=sample_rate;
//sr_to_set = 4; //176k
ret= usb_control_msg(emu0404_dev,usb_sndctrlpipe(emu0404_dev,0),
0x01,0x21, 0x0300 ,0x0C00, &sr_to_set, 1, 5000 );//записываем значение samplerate
if(ret < 0)
printk("Set samplerate: FAULT 0x%x\n",0-ret);
else
printk("Set samplerate: SUCCESS: 0x%x\n",sr_to_set);
return ret;
}
Перед командой на запись, нужно сначала дать команду на чтение, иначе ругается (а в user-mode драйвере не ругается).
Соответствие "частота"-"код команды", как ты и указывал:
Код:
enum eSampleRate {
sr_44kHz,
sr_48kHz,
sr_88kHz,
sr_96kHz,
sr_176kHz,
sr_192kHz
};
Лампочки Direct Monitoring на 176 и 192 гаснут, значит переключает
Сегодня пытался втулить кусок кода в usbaudio.h, чего-то намудрил с обновлением модулей ядра альсы - все USB девайсы начали жутко тормозить при инициализации (даже когда исходники вернул в первобытное состояние). Пришлось ядро переустанавливать. На выходных поплотнее займусь, если время будет.
Прежде чем мудрить в миксере, в самом драйвере должен быть бэк-енд, который пошлет команду карточке,
в usbaudio.h в процедуру init_usb_sample_rate() можешь не соваться, "там рыбы нет".
Социальные закладки