Het gebruik van My.Computer.Audio.Play. in vb 2022

Pagina: 1
Acties:

Onderwerpen

Vraag


Acties:
  • 0 Henk 'm!

  • ToonBrok
  • Registratie: Oktober 2013
  • Laatst online: 09-07-2024
Na “Hello world” wil ik met Visual Studio een muziekspeler maken.
Het idee is om een map met bestanden random af te spelen.
Dit zodanig dat een gespeeld nummer niet terugkomt eer alle nummer gespeeld zijn.
Pas daarna wordt weer opnieuw met de hele reeks in die map begonnen.

De basis heb ik momenteel werkend, maar niet meer dan dat.
Er is een knop om de map met bestanden aan te geven met FolderBrowserDialog1.
Daarna kan met een tweede knop de speler gestart worden, wat ook gebeurt.

Om de muziek af te spelen gebruik ik My.Computer.Audio.Play.
Dat kan op twee manieren: AudioPlayMode.WaitToComplete of AudioPlayMode.Background.

Met .WaitToComplete werkt het nu, maar er kan niets anders gedaan worden.
Een knop b.v. doet niets en in het window staat: Form1 (reageert niet) met de zandloper.
Het window Minimaliseren of Sluiten gaat nog wel en werkt zoals verwacht.

Gebruik ik .Background(loop) dan hoor ik niets, maar loopt het programma wel door.
Het resultaat lijkt dat de hele map met bestanden voorbij komt en dat steeds weer opnieuw.
Maar voor de muziek start dient zich het volgende nummer al aan enzovoorts.

Het is mij niet duidelijk met welke van de twee ik hier verder moet en hoe.

Graag wil ik twee extra knoppen: “Stop speler” en “Volgend nummer” toevoegen.
Daarnaast de mogelijkheid van een tekstblok om b.v. Titel, Artiest e.d. weer te geven.
Tenslotte zou ik liever met MP3 bestanden werken i.v.m. de grootte van de bestanden.

Kan iemand mij hiermee verder op weg helpen?

Alle reacties


Acties:
  • 0 Henk 'm!

  • Knutselsmurf
  • Registratie: December 2000
  • Laatst online: 30-05 10:17

Knutselsmurf

LED's make things better

Het onderliggende probleem is, dat je met optie .WaitToComplete je hele UI blokkeert.

Hoe dit in hoofdlijnen werkt, is dat er een thread is voor het uodate van je UI. Deze thread regelt het updaten van je venster, handelt het klikken op knoppen af enzovoort. Alle code die je rechtstreeks in bijvoorbeeld een onClick()-functie zet, wordt in deze thread uitgevoerd. Als je hier dus een play() aanroept met .WaitToComplete, zal de code letterlijk op dat punt wachten tot het hele nummer is afgelopen, om daarna pas weer verder te gaan.

De enige manier om dit op een correcte manier werkend te krijgen, is het afspelen van de muziek in een aparte thread te laten plaatsvinden. Vanuit je UI-thread, waar bijvoorbeeld alle onClick() in uit wordt gevoerd, geef je dan allen instructies door aan de achtergrond-thread.

Wellicht dat het gebruik van een andere class voor het afspelen, bijvoorbeeld https://learn.microsoft.c...windows.media.mediaplayer het afspelen wel netjes in de achtergrond uitvoert.

- This line is intentionally left blank -


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Laatst online: 22-05 08:46

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

Ik zou eens kijken naar een backgroundworker; die is niet al te complex om te gebruiken. Anders kom je al gauw in System.Thread terecht en dat lijkt me nog even een stapje te ver voor iemand die net van "Hello world" vandaan komt.

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • ToonBrok
  • Registratie: Oktober 2013
  • Laatst online: 09-07-2024
Dank voor jullie antwoorden. Wat # Knutselsmurf beschrijft is precies wat er gebeurt: niets dan alleen de muziek tot het nummer is afgelopen. Ook # RobIII geeft aan dat er een deel van het proces in de achtergrond moet draaien.
Echter dat meen ik ook te doen met AudioPlayMode.Background, maar dan gaat het ook niet goed, want dan is het alleen daar mee bezig. Dus dat moet anders.

Eerst ga ik kijken hoe ik met de geadviseerde Backgroundworker aan de slag moet. Dan proberen hoe dat in mijn code kan worden ingepast.
Voor tips en adviezen hierover houd ik me graag aanbevolen.

Overigens zie ik nog niet goed hoe binnen Visual Basic de dingen worden afgehandeld.
Wanneer er b.v. een For-Next loop draait:
Private Sub frmStart_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim x As Integer
For x = 1 To 10
txtInfo.Text = "x= " & x
Next
End Sub

Dan verwacht ik dat 10 keer de waarde van x wordt weergegeven.
Maar pas ná End Sub krijg ik de tekst met de laatste waarde van x te zien.
Gebruik ik daarentegen MsgBox("x= " & x) dan krijg ik wel wat ik verwacht.

Kortom in mijn beleving dacht ik al flink op te schieten met m’n muziekspeler.
Hoe muziek af te spelen en een tekstbestand maken, schrijven en lezen.
Dan een constructie waarmee random alle nummers één keer voorbij komen.
Maar er moeten nog wel een paar hordes genomen worden.

Hopelijk is het geen probleem om deze enthousiaste beginner enthousiast te houden.
De terminologie (b.v. UI) moet ik mezelf ook nog duidelijk maken.

Acties:
  • 0 Henk 'm!

  • Knutselsmurf
  • Registratie: December 2000
  • Laatst online: 30-05 10:17

Knutselsmurf

LED's make things better

Pas na het eindigen van deze Sub komt weer de opdracht om daadwerkelijk het venster opnieuw te tekenen, met de op dat moment aanwezig waardes. In dit voorbeeld is dat de laatste waarde die je in in hebt gestopt.

Als je dus bijvoorbeeld iedere seconde een nieuwe waarde wil tonen, volstaat een simpele For niet, omdat het daadwerkelijke updaten van het venster pas plaats vindt nadat de hele functie afgerond is. Tot die tijd blokkeert de UI, omdat ook bijvoorbeeld het verwerken van de input (klikken met de muis) pas verder gaat nadat deze functie is afgerond.

Om die reden wil je zo min mogelijk langdurende taken uitvoeren in deze UI-thread, en zoveel mogelijk op de achtergrond.

- This line is intentionally left blank -


Acties:
  • 0 Henk 'm!

  • Damic
  • Registratie: September 2003
  • Laatst online: 22:02

Damic

Tijd voor Jasmijn thee

Met Audio.play kun je momenteel alleen maar wav's afspelen https://learn.microsoft.c...y?view=windowsdesktop-8.0 ik raad ook aan om iets anders te gebruiken dan de default audio module ;)

Al wat ik aanraak werk niet meer zoals het hoort. Damic houd niet van zijn verjaardag


Acties:
  • 0 Henk 'm!

  • ToonBrok
  • Registratie: Oktober 2013
  • Laatst online: 09-07-2024
Druk doende met de Backgroundworker en dat is een hele klus (voor mij).
#RobIII zegt: Ik zou eens kijken naar een backgroundworker; die is niet al te complex om te gebruiken.
Dat kan wel zijn, maar voor mij is dit al redelijk complex hoor!

Er moeten in het formulier een aantal zaken geactiveerd worden om zo te kunnen werken. Maar ook een paar specifieke procedures aanmaken (en gebruiken): BackgroundWorker1_DoWork, BackgroundWorker1_RunWorkerCompleted en opletten hoe met variabelen moet worden omgegaan.

Eerst wil ik proberen of het lukt om een eenvoudige taak m.b.v. de Backgroundworker tot een goed einde brengen. Om te beginnen de eerder genoemde For-Next loop laten doen wat ik wil. (of kan dat eenvoudiger gedaan worden, want #RobIII heeft het over een backgroundworker, zijn er meer?)

Daarna zien hoe ik die kennis kan toepassen binnen de muziekspeler.
#Damic zegt: ik raad ook aan om iets anders te gebruiken dan de default audio module. Waar denk je dan aan?
Om met MP3 bestanden te werken probeer ik PlayMp3 van WindowsMediaPlayer. Dat werkt wanneer ik direct een MP3 bestand wil afspelen, maar zodra het wordt gebruikt in de code die ik heb voor de random afhandeling is het afgelopen. Verder vind ik maar weinig info over hoe PlayMP3 te gebruiken.

Kortom, ik ga me niet vervelen tijdens de feestdagen.
Pagina: 1