IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Contrôle du volume (Windows)

Voici un code MATLAB pour ajuster le volume sonore sous Windows (32 et 64 bits)
Avatar de Jerome Briot
Rédacteur/Modérateur https://www.developpez.com
Le 22/01/2009 à 9:44
C'est plutôt pas mal ça...

La valeur max du volume est-elle fixée ? (j'ai 32767 sur ma machine)
Avatar de paradize3
Membre averti https://www.developpez.com
Le 22/01/2009 à 13:21
oui il y a un maximum... qui dépend de la carte son... (mais au max 2^16-1 dans tous les cas)

Salutations,

Grég
Avatar de Jerome Briot
Rédacteur/Modérateur https://www.developpez.com
Le 22/01/2009 à 15:25
Une petite télécommande toute simple :

Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
function ctrvol

fig = figure('units','normalized',...
    'position',[.1 .1 .1 .33],...
    'menubar','none',...
    'toolbar','none',...
    'resize','off',...
    'numbertitle','off');

movegui(fig,'center')

[left, right] = mx_volume('WAVE');

uicontrol('style','slider',...
    'units','normalized',...
    'position',[.2 .2 .2 .7],...
    'tag','slidl',...
    'max',(2^16-1)/2,...
    'callback',@cb_vol,...
    'value',left)

uicontrol('style','slider',...
    'units','normalized',...
    'position',[.6 .2 .2 .7],...
    'tag','slidr',...
    'max',(2^16-1)/2,...
    'callback',@cb_vol,...
    'value',right)

uicontrol('style','checkbox',...
    'units','normalized',...
    'position',[.2 .05 .2 .1],...
    'tag','chkl',...
    'value',1,...
    'callback',@cb_vol)

uicontrol('style','checkbox',...
    'units','normalized',...
    'position',[.6 .05 .2 .1],...
    'tag','chkr',...
    'value',1,...
    'callback',@cb_vol)

handles = guihandles(fig);
guidata(fig,handles);

function cb_vol(obj,event)

    handles = guidata(gcbf);
    
    [left, right] = mx_volume('WAVE');
    
    switch get(obj,'tag')
        
        case 'chkr'
            val = get(obj,'value');
            if ~val
                mx_volume('WAVE', left, 0);
            else
                mx_volume('WAVE', left, get(handles.slidr,'value'));
            end
        case 'chkl'
            val = get(obj,'value');
            if ~val
                mx_volume('WAVE', 0, right);
            else
                mx_volume('WAVE', get(handles.slidl,'value'), right);
            end
            
        case 'slidr'

            if get(handles.chkr,'value')
                mx_volume('WAVE', left, get(obj,'value'));
            end
            
        case 'slidl'
            if get(handles.chkl,'value')
                mx_volume('WAVE', get(obj,'value'), right);
            end
    end
Les uicontrol de gauche pour le canal de gauche, ceux de droite, pour le canal de droite

Il faut bien entendu que mx_volume.mexw32 soit dans le même répertoire

A améliorer...
Avatar de Jerome Briot
Rédacteur/Modérateur https://www.developpez.com
Le 24/01/2009 à 23:21
Avec des slider qui répondent en temps réel :

Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
function ctrvol

fig = findobj('type','figure','tag','ctrvol');

if ishandle(fig)
    return
end

fig = figure('units','normalized',...
    'position',[.1 .1 .1 .33],...
    'menubar','none',...
    'toolbar','none',...
    'resize','off',...
    'numbertitle','off',...
    'visible','off',...
    'tag','ctrvol');

movegui(fig,'center')

[left, right] = mx_volume('WAVE');

u = uipanel('units','normalized',...
    'position',[.066 .15 .4 .8],...
    'title','Left');

handles.ui(1) = uicomponent(u,'style','javax.swing.jslider','name','slidl',...
    'units','normalized','Orientation',true,...
    'minimum',0,'maximum',100,'value',100*double(left)/((2^16-2)/2),...
    'PaintTicks',true,'MajorTickSpacing',50,...
    'PaintLabels', true,'MajorTickSpacing',10);
set(handles.ui(1),'position',[.05 0 .9 1],'StateChangedCallback',@cb_vol);

u = uipanel('units','normalized',...
    'position',[.533 .15 .4 .8],...
    'title','Right');

handles.ui(2) = uicomponent(u,'style','javax.swing.jslider','name','slidr',...
    'units','normalized','Orientation',true,...
    'minimum',0,'maximum',100,'value',100*double(right)/((2^16-2)/2),...
    'PaintTicks',true,'MajorTickSpacing',50,...
    'PaintLabels', true,'MajorTickSpacing',10);
set(handles.ui(2),'position',[.05 0 .9 1],'StateChangedCallback',@cb_vol);

u = uipanel('units','normalized','position', [.066 .02 .868 .125],...
    'title','Mute');
handles.chkl = uicontrol(u,'style','checkbox',...
    'units','normalized',...
    'position',[.15 .05 .3 .9],...
    'tag','chkl',...
    'value',1,...
    'callback',@cb_vol);

handles.chkr = uicontrol(u,'style','checkbox',...
    'units','normalized',...
    'position',[.7 .05 .3 .9],...
    'tag','chkr',...
    'value',1,...
    'callback',@cb_vol);

guidata(fig,handles);

set(fig,'visible','on')

function cb_vol(obj,event)

    val = get(obj,'value');

    if isprop(obj,'name')
        str = get(obj,'name');
    else str = get(obj,'tag');
    end

    fig = findobj('type','figure','tag','ctrvol');
    handles = guidata(fig);
    
    [left, right] = mx_volume('WAVE');
    
    switch str
        
        case 'chkr'
            if ~val
                mx_volume('WAVE', left, 0);
            else
                mx_volume('WAVE', left, (2^16-1)/2*get(handles.ui(2),'value')/100);
            end
        case 'chkl'
            if ~val
                mx_volume('WAVE', 0, right);
            else
                mx_volume('WAVE', (2^16-1)/2*get(handles.ui(1),'value')/100, right);
            end
            
        case 'slidr'
            val = (2^16-1)/2*val/100;
            if get(handles.chkr,'value')
                mx_volume('WAVE', left, val);
            end
            
        case 'slidl'
            val = (2^16-1)/2*val/100;
            if get(handles.chkl,'value')
                mx_volume('WAVE', val, right);
            end
    end
Il faut récupérer cette contribution du FEX : UICOMPONENT - expands uicontrol to all Java classes
Avatar de Jerome Briot
Rédacteur/Modérateur https://www.developpez.com
Le 08/01/2010 à 17:58
Ajout d'une version compilée de la Dll pour les version 7 de MATLAB
Avatar de Jerome Briot
Rédacteur/Modérateur https://www.developpez.com
Le 08/06/2013 à 15:52
Ajout d'une version compilée pour les versions 64 bits de MATLAB
Developpez.com décline toute responsabilité quant à l'utilisation des différents éléments téléchargés.