Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[WIP] Define Sherlock() class for better OOP #2

Open
wants to merge 19 commits into
base: main
Choose a base branch
from
Open

[WIP] Define Sherlock() class for better OOP #2

wants to merge 19 commits into from

Conversation

mtdhuynh
Copy link
Collaborator

@mtdhuynh mtdhuynh commented Jan 24, 2022

Implement a Sherlock class with all the button pressing event callbacks and functionalities.

Closes #1.

@mtdhuynh mtdhuynh added the enhancement New feature or request label Jan 24, 2022
@mtdhuynh mtdhuynh self-assigned this Jan 24, 2022
@mtdhuynh
Copy link
Collaborator Author

mtdhuynh commented Jan 24, 2022

Chi di voi ha il RaspberryPi riesce a testare se funziona tutto? Grazie!

PS: sarebbe da seguire gli step presenti nel README.md con l'installazione e tutto (se non volete aprire il venv, mi sa che dovrete installare manualmente pyyaml, con pip3 install pyyaml).

@mrDaerio @TeoBistoni @rossinda

@mtdhuynh
Copy link
Collaborator Author

mtdhuynh commented Feb 3, 2022

Update 03 Feb. 2022
Io e @TeoBistoni abbiamo provato il codice attuale oggi. Per farla breve funziona quasi tutto (che alla fine questo refactoring era solo una trasposizione di quanto fatto prima). Quindi, i vari metodi _forward, _backward, _play_pause della classe Sherlock funzionano tutti (a meno di un fastidioso doppio click dovuto a una compensazione del bounce effect non troppo efficace - risolvibile tramite condensatori, secondo @TeoBistoni). Possiamo eventualmente discutere sulla comprensibilità del codice così come scritto, ed eventualmente provare a modulizzare ulteriormente in future iterazioni.

Il problema principale riscontrato sta nel fast-forward: l'implementazione attuale funziona. Se si tiene premuto il pulsante NEXT/BACK, si rimane nel while loop del metodo _long_press e la traccia effettivamente viene mandata avanti di SKIP_TIME secondi se il pulsante viene tenuto premuto oltre LONG_PRESS secondi (entrambi definiti in config/sherlock_parameters.yaml).

Tuttavia, questo funziona solo per un loop soltanto. Infatti, se si tiene premuto più a lungo, si rimane nel while come previsto, ma si riscontra un problema nella funzione set_pos di pygame.mixer.music.

Infatti, set_pos modifica la posizione della traccia rispetto al valore ritornato da get_pos, ossia il tempo in millisecondi dalla chiamata di play della traccia corrente, indipendentemente da eventuali offset "manuali". Quindi, chiamando ripetutamente set_pos (tenendo premuto il pulsante per N*LONG_PRESS secondi), pygame.mixer.music continua a far ripartire la traccia da get_pos+SKIP_TIME secondi, senza fare l'update di get_pos. Per fare un esempio:

  • Tempo di playback della traccia corrente: 24 secondi (i.e., get_pos=24000 ms).
  • SKIP_TIME=10 secondi.
  1. Tenere premuto a lungo il pulsante NEXT, fa scattare set_pos.
  2. set_pos=get_pos+SKIP_TIME, ossia in questo caso, la traccia passa da 24 secondi a 24+10=34 secondi.
  3. Se si tiene premuto continuamente il pulsante NEXT, si continua a chiamare set_pos.
  4. set_pos tuttavia continua a ripetere lo step 2), senza aggiornare get_pos (che rimane sempre a 24 secondi).

N.B.: set_pos per file .mp3 modifica la posizione temporale relativa, ossia aggiunge secondi rispetto al tempo di playback attuale, quindi rispetto al valore ritornato da get_pos, che però rimane lo stesso anche se set_pos aggiunge o toglie secondi.

Dovremo quindi implementare un attributo (e.g., self.time_from_start) che tiene traccia del tempo di playback (ossia get_pos), e che poi andiamo a incrementare man mano che viene chiamato _fastforward. Inoltre, siccome set_pos per file .mp3 modifica il tempo relativo, e self.time_from_start invece terra traccia del tempo assoluto/globale, oltre a usare set_pos, dovremo anche fare un rewind (come da documentazione). Questo dovrebbe anche aiutare nell'estensione al supporto a diversi formati audio, oltre l'.mp3. Non dovrebbe servire inserirlo nel file di configurazione, visto che dovrebbe essere un "problema" del backend e l'utente non dovrebbe avere visibilità o possibilità di modifica.

@mrDaerio se hai tempo, ci puoi dare un'occhiata tu? Prima del prossimo weekend non posso metterci mano purtroppo. Poi posso fare la review! Altrimenti, provo a farlo io :)

@mrDaerio mrDaerio mentioned this pull request Feb 3, 2022
Copy link
Collaborator

@mrDaerio mrDaerio left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Possibili miglioramenti futuri/test da effettuare con il rasp:

  • Decidere comportamento di _fastforward (e _fastbackward) se si passano i confini del file audio
  • Generalizzare ulteriormente _long_press, es. parametrizzare la frequenza, per ogni azione (?)
  • Provare comportamento su pressione contemporanea di tasti
  • Distinguere tracce audio (sotto_categorie di descrizione, es. 'lavandino') da categorie (es 'bagno'). Come si comportano?
  • Tasto pausa come "home" se premuto a lungo?
  • Più formati audio ecc...

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Define Sherlock() class for better OOP
2 participants