DEMO: ses karti infosu

Başlatan unixmania, 14 Ekim 2019 - 11:23:25

« önceki - sonraki »

0 Üyeler ve 1 Ziyaretçi konuyu incelemekte.

unixmania

Ses kartinin ozelliklerini basan/degistiren bir demo program yazdim. Ses sorunu yasayanlara faydali olabilir.

Kaynak kodu sadece 150 satir oldugundan direk asagida veriyom.


#include <sys/ioctl.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <sound/asound.h>

static struct snd_ctl_elem_value         eval;
static struct snd_ctl_card_info          ci;
static struct snd_ctl_elem_list          elst;
static struct snd_ctl_elem_info          einf;
static struct snd_ctl_elem_id            eid[56];
static struct snd_ctl_elem_id            id;
static struct snd_pcm_info               pcm;


static char*  typ[7] = {"invalid", "boolean", "integer", "enum", "byte array", "IEC958 S/PDIF", "64-bit integer"};
static char*  ifc[7] = {"global control", "hwdep", "mixer", "PCM", "RawMidi", "timer", "sequencer"};


int main(int argc, char* argv[])
{
int ctl = -1, tmp = 0, numid = 0;
long val = 7777;
char* end = NULL;

ctl = open("/dev/snd/controlC0", O_RDWR);
ioctl(ctl, SNDRV_CTL_IOCTL_CARD_INFO, &ci);

ioctl(ctl, SNDRV_CTL_IOCTL_PCM_INFO, &pcm);

ioctl(ctl, SNDRV_CTL_IOCTL_PCM_PREFER_SUBDEVICE, &tmp);

ioctl(ctl, SNDRV_CTL_IOCTL_ELEM_LIST, &elst);

if(argc == 3)
{
numid = atoi(argv[1]);
val   = strtol(argv[2], &end, 10);

if(numid<1 || numid>elst.count || strlen(end))
{
printf("invalid argument: arguments must be numeric and first argument must be in range [1, %d]\n", elst.count);
return -1;
}

elst.space  = 1;
elst.offset = numid-1;
elst.pids   = &id;
ioctl(ctl, SNDRV_CTL_IOCTL_ELEM_LIST, &elst);
printf("    %u - %s\n", id.numid, id.name);

einf.id = id;
ioctl(ctl, SNDRV_CTL_IOCTL_ELEM_INFO, &einf);

if((einf.type == SNDRV_CTL_ELEM_TYPE_BOOLEAN || einf.type == SNDRV_CTL_ELEM_TYPE_INTEGER) && einf.count == 1 && einf.access & SNDRV_CTL_ELEM_ACCESS_WRITE)
{
eval.id = id;
ioctl(ctl, SNDRV_CTL_IOCTL_ELEM_READ, &eval);
printf("value: %ld (old)\n", eval.value.integer.value[0]);

eval.value.integer.value[0] = val;
ioctl(ctl, SNDRV_CTL_IOCTL_ELEM_WRITE, &eval);

ioctl(ctl, SNDRV_CTL_IOCTL_ELEM_READ, &eval);
printf("value: %ld (new - read back after write)\n\n", eval.value.integer.value[0]);
}

else  puts("invalid element: its type must be boolean or integer, must writable and contains single value.");

perror("");
return 0;
}

printf("id         : %s\ndriver     : %s\nname       : %s\nlname      : %s\nmixer      : %s\ncomponents : %s\n\n", ci.id, ci.driver, ci.name, ci.longname, ci.mixername, ci.components);
printf("device     : %u\nsubdev     : %u\nstream     : %d\ncard       : %d\nid         : %s\nname       : %s\nsubname    : %s\nclass      : %d\nsubclass   : %d\nsubdev_cnt : %u\nsubdev_ava : %u\nsync       : %d\n\n", pcm.device, pcm.subdevice, pcm.stream, pcm.card, pcm.id, pcm.name, pcm.subname, pcm.dev_class, pcm.dev_subclass, pcm.subdevices_count, pcm.subdevices_avail, pcm.sync.id32[0]);
printf("elem_count : %d\n\n", elst.count);

elst.space  = elst.count;
elst.offset = 0;
elst.pids   = eid;
ioctl(ctl, SNDRV_CTL_IOCTL_ELEM_LIST, &elst);


for(int i=0; i<elst.count; i++)
{
printf("numid      : %u\niface      : %s\ndevice     : %u\nsubdev     : %u\nindex      : %u\nname       : %s\n", eid[i].numid, ifc[eid[i].iface], eid[i].device, eid[i].subdevice, eid[i].index, eid[i].name);

memset(&einf, 0, sizeof(einf));
einf.id = eid[i];
ioctl(ctl, SNDRV_CTL_IOCTL_ELEM_INFO, &einf);

printf("type       : %s\naccess     : %s  0x%x\ncount      : %u\nowner      : %d\n", typ[einf.type], einf.access & SNDRV_CTL_ELEM_ACCESS_WRITE ? "writable" : "readonly", einf.access, einf.count, einf.owner);

if(einf.type == SNDRV_CTL_ELEM_TYPE_BOOLEAN)
{
memset(&eval, 0, sizeof(eval));
eval.id = eid[i];
ioctl(ctl, SNDRV_CTL_IOCTL_ELEM_READ, &eval);
printf("value      : %ld\n\n", eval.value.integer.value[0]);
}

else if(einf.type == SNDRV_CTL_ELEM_TYPE_INTEGER)
{
printf("min        : %ld\nmax        : %ld\nstep       : %ld\n", einf.value.integer.min, einf.value.integer.max, einf.value.integer.step);
memset(&eval, 0, sizeof(eval));
eval.id = eid[i];
ioctl(ctl, SNDRV_CTL_IOCTL_ELEM_READ, &eval);

for(int j=0; j<einf.count; j++)
{
printf("value%d     : %ld\n", j, eval.value.integer.value[j]);
}

puts("");
}

else if(einf.type == SNDRV_CTL_ELEM_TYPE_INTEGER64)
{
printf("min        : %lld\nmax        : %lld\nstep       : %lld\n", einf.value.integer64.min, einf.value.integer64.max, einf.value.integer64.step);
memset(&eval, 0, sizeof(eval));
eval.id = eid[i];
ioctl(ctl, SNDRV_CTL_IOCTL_ELEM_READ, &eval);

for(int j=0; j<einf.count; j++)
{
printf("value%d     : %lld\n", j, eval.value.integer64.value[j]);
}

puts("");
}

else if(einf.type == SNDRV_CTL_ELEM_TYPE_ENUMERATED)
{
memset(&eval, 0, sizeof(eval));
eval.id = eid[i];
ioctl(ctl, SNDRV_CTL_IOCTL_ELEM_READ, &eval);

printf("value      : %u (#enums: %u,  %u ---> %s)\n\n", eval.value.enumerated.item[0], einf.value.enumerated.items, einf.value.enumerated.item, einf.value.enumerated.name);
}

else puts("");
}

    perror("FINAL");
return 0;
}



Kodu derlemek icin: Yukardaki kodu kopyalayip "kod.c" dosyasi olarak kaydettiginizi ve derleme sonucu olusan programada "info" adini verdiginizi farzederek (verdiginiz isimler farketmez)


gcc -Wall kod.c -o info


komutunu verin. ayni klasorde "info" isimli program olusacaktir. Program benim sistemdeki ciktisi soyle:


$ ./info

id         : PCH
driver     : HDA-Intel
name       : HDA Intel PCH
lname      : HDA Intel PCH at 0xb1120000 irq 127
mixer      : Realtek ALC269VC
components : HDA:10ec0269,1b0a22c9,00100203 HDA:8086280b,80860101,00100000

device     : 0
subdev     : 0
stream     : 0
card       : 0
id         : ALC269VC Analog
name       : ALC269VC Analog
subname    : subdevice #0
class      : 0
subclass   : 0
subdev_cnt : 1
subdev_ava : 1
sync       : 0

elem_count : 56

numid      : 1
iface      : mixer
device     : 0
subdev     : 0
index      : 0
name       : Headphone Playback Volume
type       : integer
access     : writable  0x10000013
count      : 2
owner      : -1
min        : 0
max        : 87
step       : 0
value0     : 87
value1     : 87

numid      : 2
iface      : mixer
device     : 0
subdev     : 0
index      : 0
name       : Headphone Playback Switch
type       : boolean
access     : writable  0x3
count      : 2
owner      : -1
value      : 1

numid      : 3
iface      : mixer
device     : 0
subdev     : 0
index      : 0
name       : Speaker Playback Volume
type       : integer
access     : writable  0x10000013
count      : 2
owner      : -1
min        : 0
max        : 87
step       : 0
value0     : 87
value1     : 87

numid      : 4
iface      : mixer
device     : 0
subdev     : 0
index      : 0
name       : Speaker Playback Switch
type       : boolean
access     : writable  0x3
count      : 2
owner      : -1
value      : 1

numid      : 5
iface      : mixer
device     : 0
subdev     : 0
index      : 0
name       : Loopback Mixing
type       : enum
access     : writable  0x3
count      : 1
owner      : -1
value      : 0 (#enums: 2,  0 ---> Disabled)

numid      : 6
iface      : mixer
device     : 0
subdev     : 0
index      : 0
name       : Mic Playback Volume
type       : integer
access     : writable  0x10000013
count      : 2
owner      : -1
min        : 0
max        : 31
step       : 0
value0     : 0
value1     : 0

numid      : 7
iface      : mixer
device     : 0
subdev     : 0
index      : 0
name       : Mic Playback Switch
type       : boolean
access     : writable  0x3
count      : 2
owner      : -1
value      : 0

numid      : 8
iface      : mixer
device     : 0
subdev     : 0
index      : 0
name       : Auto-Mute Mode
type       : enum
access     : writable  0x3
count      : 1
owner      : -1
value      : 1 (#enums: 2,  0 ---> Disabled)

numid      : 9
iface      : mixer
device     : 0
subdev     : 0
index      : 0
name       : Capture Volume
type       : integer
access     : writable  0x10000013
count      : 2
owner      : -1
min        : 0
max        : 63
step       : 0
value0     : 0
value1     : 0

numid      : 10
iface      : mixer
device     : 0
subdev     : 0
index      : 0
name       : Capture Switch
type       : boolean
access     : writable  0x3
count      : 2
owner      : -1
value      : 0

numid      : 11
iface      : mixer
device     : 0
subdev     : 0
index      : 0
name       : Mic Boost Volume
type       : integer
access     : writable  0x10000013
count      : 2
owner      : -1
min        : 0
max        : 3
step       : 0
value0     : 0
value1     : 0

numid      : 12
iface      : mixer
device     : 0
subdev     : 0
index      : 0
name       : Internal Mic Boost Volume
type       : integer
access     : writable  0x10000013
count      : 2
owner      : -1
min        : 0
max        : 3
step       : 0
value0     : 0
value1     : 0

numid      : 13
iface      : mixer
device     : 0
subdev     : 0
index      : 0
name       : Master Playback Volume
type       : integer
access     : writable  0x13
count      : 1
owner      : -1
min        : 0
max        : 87
step       : 0
value0     : 0

numid      : 14
iface      : mixer
device     : 0
subdev     : 0
index      : 0
name       : Master Playback Switch
type       : boolean
access     : writable  0x3
count      : 1
owner      : -1
value      : 0

numid      : 15
iface      : global control
device     : 0
subdev     : 0
index      : 0
name       : Mic Jack
type       : boolean
access     : readonly  0x1
count      : 1
owner      : -1
value      : 0

numid      : 16
iface      : global control
device     : 0
subdev     : 0
index      : 0
name       : Internal Mic Phantom Jack
type       : boolean
access     : readonly  0x1
count      : 1
owner      : -1
value      : 1

numid      : 17
iface      : global control
device     : 0
subdev     : 0
index      : 0
name       : Headphone Jack
type       : boolean
access     : readonly  0x1
count      : 1
owner      : -1
value      : 0

numid      : 18
iface      : global control
device     : 0
subdev     : 0
index      : 0
name       : Speaker Phantom Jack
type       : boolean
access     : readonly  0x1
count      : 1
owner      : -1
value      : 1

numid      : 19
iface      : PCM
device     : 0
subdev     : 0
index      : 0
name       : Playback Channel Map
type       : integer
access     : readonly  0x10000011
count      : 2
owner      : -1
min        : 0
max        : 36
step       : 0
value0     : 0
value1     : 0

numid      : 20
iface      : PCM
device     : 0
subdev     : 0
index      : 0
name       : Capture Channel Map
type       : integer
access     : readonly  0x10000011
count      : 2
owner      : -1
min        : 0
max        : 36
step       : 0
value0     : 0
value1     : 0

numid      : 21
iface      : global control
device     : 0
subdev     : 0
index      : 0
name       : HDMI/DP,pcm=3 Jack
type       : boolean
access     : readonly  0x1
count      : 1
owner      : -1
value      : 0

numid      : 22
iface      : mixer
device     : 0
subdev     : 0
index      : 0
name       : IEC958 Playback Con Mask
type       : IEC958 S/PDIF
access     : readonly  0x1
count      : 1
owner      : -1

numid      : 23
iface      : mixer
device     : 0
subdev     : 0
index      : 0
name       : IEC958 Playback Pro Mask
type       : IEC958 S/PDIF
access     : readonly  0x1
count      : 1
owner      : -1

numid      : 24
iface      : mixer
device     : 0
subdev     : 0
index      : 0
name       : IEC958 Playback Default
type       : IEC958 S/PDIF
access     : writable  0x3
count      : 1
owner      : -1

numid      : 25
iface      : mixer
device     : 0
subdev     : 0
index      : 0
name       : IEC958 Playback Switch
type       : boolean
access     : writable  0x3
count      : 1
owner      : -1
value      : 1

numid      : 26
iface      : PCM
device     : 3
subdev     : 0
index      : 0
name       : ELD
type       : byte array
access     : readonly  0x5
count      : 0
owner      : -1

numid      : 27
iface      : global control
device     : 0
subdev     : 0
index      : 0
name       : HDMI/DP,pcm=7 Jack
type       : boolean
access     : readonly  0x1
count      : 1
owner      : -1
value      : 0

numid      : 28
iface      : mixer
device     : 0
subdev     : 0
index      : 1
name       : IEC958 Playback Con Mask
type       : IEC958 S/PDIF
access     : readonly  0x1
count      : 1
owner      : -1

numid      : 29
iface      : mixer
device     : 0
subdev     : 0
index      : 1
name       : IEC958 Playback Pro Mask
type       : IEC958 S/PDIF
access     : readonly  0x1
count      : 1
owner      : -1

numid      : 30
iface      : mixer
device     : 0
subdev     : 0
index      : 1
name       : IEC958 Playback Default
type       : IEC958 S/PDIF
access     : writable  0x3
count      : 1
owner      : -1

numid      : 31
iface      : mixer
device     : 0
subdev     : 0
index      : 1
name       : IEC958 Playback Switch
type       : boolean
access     : writable  0x3
count      : 1
owner      : -1
value      : 1

numid      : 32
iface      : PCM
device     : 7
subdev     : 0
index      : 0
name       : ELD
type       : byte array
access     : readonly  0x5
count      : 0
owner      : -1

numid      : 33
iface      : global control
device     : 0
subdev     : 0
index      : 0
name       : HDMI/DP,pcm=8 Jack
type       : boolean
access     : readonly  0x1
count      : 1
owner      : -1
value      : 0

numid      : 34
iface      : mixer
device     : 0
subdev     : 0
index      : 2
name       : IEC958 Playback Con Mask
type       : IEC958 S/PDIF
access     : readonly  0x1
count      : 1
owner      : -1

numid      : 35
iface      : mixer
device     : 0
subdev     : 0
index      : 2
name       : IEC958 Playback Pro Mask
type       : IEC958 S/PDIF
access     : readonly  0x1
count      : 1
owner      : -1

numid      : 36
iface      : mixer
device     : 0
subdev     : 0
index      : 2
name       : IEC958 Playback Default
type       : IEC958 S/PDIF
access     : writable  0x3
count      : 1
owner      : -1

numid      : 37
iface      : mixer
device     : 0
subdev     : 0
index      : 2
name       : IEC958 Playback Switch
type       : boolean
access     : writable  0x3
count      : 1
owner      : -1
value      : 1

numid      : 38
iface      : PCM
device     : 8
subdev     : 0
index      : 0
name       : ELD
type       : byte array
access     : readonly  0x5
count      : 0
owner      : -1

numid      : 39
iface      : global control
device     : 0
subdev     : 0
index      : 0
name       : HDMI/DP,pcm=9 Jack
type       : boolean
access     : readonly  0x1
count      : 1
owner      : -1
value      : 0

numid      : 40
iface      : mixer
device     : 0
subdev     : 0
index      : 3
name       : IEC958 Playback Con Mask
type       : IEC958 S/PDIF
access     : readonly  0x1
count      : 1
owner      : -1

numid      : 41
iface      : mixer
device     : 0
subdev     : 0
index      : 3
name       : IEC958 Playback Pro Mask
type       : IEC958 S/PDIF
access     : readonly  0x1
count      : 1
owner      : -1

numid      : 42
iface      : mixer
device     : 0
subdev     : 0
index      : 3
name       : IEC958 Playback Default
type       : IEC958 S/PDIF
access     : writable  0x3
count      : 1
owner      : -1

numid      : 43
iface      : mixer
device     : 0
subdev     : 0
index      : 3
name       : IEC958 Playback Switch
type       : boolean
access     : writable  0x3
count      : 1
owner      : -1
value      : 1

numid      : 44
iface      : PCM
device     : 9
subdev     : 0
index      : 0
name       : ELD
type       : byte array
access     : readonly  0x5
count      : 0
owner      : -1

numid      : 45
iface      : global control
device     : 0
subdev     : 0
index      : 0
name       : HDMI/DP,pcm=10 Jack
type       : boolean
access     : readonly  0x1
count      : 1
owner      : -1
value      : 0

numid      : 46
iface      : mixer
device     : 0
subdev     : 0
index      : 4
name       : IEC958 Playback Con Mask
type       : IEC958 S/PDIF
access     : readonly  0x1
count      : 1
owner      : -1

numid      : 47
iface      : mixer
device     : 0
subdev     : 0
index      : 4
name       : IEC958 Playback Pro Mask
type       : IEC958 S/PDIF
access     : readonly  0x1
count      : 1
owner      : -1

numid      : 48
iface      : mixer
device     : 0
subdev     : 0
index      : 4
name       : IEC958 Playback Default
type       : IEC958 S/PDIF
access     : writable  0x3
count      : 1
owner      : -1

numid      : 49
iface      : mixer
device     : 0
subdev     : 0
index      : 4
name       : IEC958 Playback Switch
type       : boolean
access     : writable  0x3
count      : 1
owner      : -1
value      : 1

numid      : 50
iface      : PCM
device     : 10
subdev     : 0
index      : 0
name       : ELD
type       : byte array
access     : readonly  0x5
count      : 0
owner      : -1

numid      : 51
iface      : PCM
device     : 3
subdev     : 0
index      : 0
name       : Playback Channel Map
type       : integer
access     : writable  0x10000013
count      : 8
owner      : -1
min        : 0
max        : 36
step       : 0
value0     : 0
value1     : 0
value2     : 0
value3     : 0
value4     : 0
value5     : 0
value6     : 0
value7     : 0

numid      : 52
iface      : PCM
device     : 7
subdev     : 0
index      : 0
name       : Playback Channel Map
type       : integer
access     : writable  0x10000013
count      : 8
owner      : -1
min        : 0
max        : 36
step       : 0
value0     : 0
value1     : 0
value2     : 0
value3     : 0
value4     : 0
value5     : 0
value6     : 0
value7     : 0

numid      : 53
iface      : PCM
device     : 8
subdev     : 0
index      : 0
name       : Playback Channel Map
type       : integer
access     : writable  0x10000013
count      : 8
owner      : -1
min        : 0
max        : 36
step       : 0
value0     : 0
value1     : 0
value2     : 0
value3     : 0
value4     : 0
value5     : 0
value6     : 0
value7     : 0

numid      : 54
iface      : PCM
device     : 9
subdev     : 0
index      : 0
name       : Playback Channel Map
type       : integer
access     : writable  0x10000013
count      : 8
owner      : -1
min        : 0
max        : 36
step       : 0
value0     : 0
value1     : 0
value2     : 0
value3     : 0
value4     : 0
value5     : 0
value6     : 0
value7     : 0

numid      : 55
iface      : PCM
device     : 10
subdev     : 0
index      : 0
name       : Playback Channel Map
type       : integer
access     : writable  0x10000013
count      : 8
owner      : -1
min        : 0
max        : 36
step       : 0
value0     : 0
value1     : 0
value2     : 0
value3     : 0
value4     : 0
value5     : 0
value6     : 0
value7     : 0

numid      : 56
iface      : mixer
device     : 0
subdev     : 0
index      : 0
name       : PCM Playback Volume
type       : integer
access     : writable  0x30000033
count      : 2
owner      : -1
min        : 0
max        : 255
step       : 0
value0     : 255
value1     : 255


beim kartin 56 tane ozelligi varmis. Yukardaki komut ozellikleri basmak icin. Degistirmek icin komutu soyle kullaniyoruz.

komut ozellik_nosu  ozellik_degeri

ozellik_nosu: yukardaki ciktidaki "numid" degeri
ozellik_degeri: vermek istedigimiz sayisal deger

ornek kullanim:


$ ./info 13 87

    13 - Master Playback Volume
value: 0 (old)
value: 87 (new - read back after write)


NOT: Her ozelligi degistiremiyoruz! :)  Degistirilebilecek ozellikler yukardaki info goz onune alindiginda asagidakileri saglayan ozelleklerdir:

type: boolean veya integer olmali
access: writable  olmali
count: 1  olmali.

Onur48