URL:     https://linuxfr.org/forums/programmation-python/posts/bouton-volume-mpd
Title:   Bouton Volume MPD
Authors: zephyr32
Date:    2024-09-26T12:04:38+02:00
License: CC By-SA
Tags:    
Score:   2


Bonjour,

J'ai fait une petite radio avec Raspberry Pi Zero W.
J'ai simplement ajouté une carte son et j'écoute la radio via MPD.
MPD daemon est contrôlé via l'interface "mpc".

On peut contrôler le volume avec la commande 'mpc volume 50' par exemple.


Pour éviter le terminal, j'ai ajouté un encodeur rotatif.
J'utilise ce petit script ci-dessous que j'ai trouvé sur github.
Ca marche plutôt à une chose prêt.

La limite de volume est 100. Si on tape la commande 'mpc volume 110' on a une erreur et le volume reste à son état actuel.

Le problème avec l'encodeur rotatif c'est que, si on le tourne trop loin, le volume va aller jusqu'à 100 mais la variable "currVolume" augmente avec la rotation. On peut dépasser les 100 si on tourne trop vite a fond ! Du coup pour baisser le volume ensuite, il faut d'abord baisser la valeur à 100 (sans effet sonore donc). Le volume se baissera à partir de 100 seulement.

J'ai essayé de bidouiller ce script mais sans succès.
Quelqu'un aurait une idée de la modification nécessaire ?

Vous allez me dire que c'est du chichi et j'ai qu'a faire attention.
Mais cette petite radio, c'est pour donner aux vieux. Un petit bruit au fond de la cuisine :) Plus c'est simple mieux c'est. 

```python
#!/usr/bin/python
#Control MPD Client volume using a physical rotary encoder
#pip install mopidy-spotify

from RPi import GPIO
from time import sleep
import os

clk = 17
dt = 27

GPIO.setmode(GPIO.BCM)
GPIO.setup(clk, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
GPIO.setup(dt, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)

counter = 0
clkLastState = GPIO.input(clk)
currVolume = 50

try:
        while True:
                clkState = GPIO.input(clk)
                dtState = GPIO.input(dt)
                if clkState != clkLastState:
                        if dtState != clkState:
                                currVolume += 5
                        else:
                                currVolume -= 5
#                       print currVolume
                        os.system("mpc volume " + str(currVolume))
                        clkLastState = clkState
                        sleep(0.01)
finally:
        GPIO.cleanup
```


Merci pour votre aide.
