[C#] onbepaald aantal mp3 bestanden na elkaar afspelen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Grompie
  • Registratie: Maart 2010
  • Laatst online: 15-04-2024
Beste tweakers/programmeurs,

Ik werk momenteel aan een programma waarbij ik een array van mp3 bestanden mee krijg. Deze wens ik dan af te spelen. Wanneer er maar 1 bestand moet worden afgespeeld is er geen enkel probleem, wanneer ik echter 2 of meer bestanden moet afspelen dan begint hij met het afspelen van bestand1 maar meteen daarna met bestand 2 waardoor je dus enkel maar bestand 2 te horen krijgt.

Ik heb al geprobeerd om mijn programma in een lus te stoppen tot mijn bestand niet meer speelt maar dan hangt mijn programma voor onbepaalde duur en dit mag niet gebeuren.

Heb het eerst met de winmm.dll gewerkt voor geluiden af te spelen en nu met WMPLib maar deze geven telkens hetzelfde resultaat.

Hebben jullie soms tips/methodes voor mij?

Mvg,
Pieter

Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
Lees je eens in op threading.

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • 0 Henk 'm!

  • TUX2K
  • Registratie: September 2001
  • Laatst online: 17-09 12:46
Als ik het zo lees start je dus direct alle bestanden, in plaats van dat je wacht tot er een is afgespeeld.
De gebruikte componenten ken ik niet, maar misschien dat die een event hebben die wordt aangesproken als hij klaar is met spelen.
Waarna je de volgende MP3 kan gaan afspelen.

Hoeft dus niet met multie threading.

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Mijn glazen bol is kapot, en je geeft dus echt te weinig informatie om je te helpen. Je zult minstens even moeten laten zien ( doormiddel van een klein stukje voorbeeld code ) hoe je op dit moment je muziek af wil spelen.

code:
1
2
3
voor alle nummer in array
    start nummer
    wacht tot nummer klaar is

Zou gewoon moeten werken.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Woy schreef op woensdag 24 maart 2010 @ 12:28:
Mijn glazen bol is kapot, en je geeft dus echt te weinig informatie om je te helpen. Je zult minstens even moeten laten zien ( doormiddel van een klein stukje voorbeeld code ) hoe je op dit moment je muziek af wil spelen.

code:
1
2
3
voor alle nummer in array
    start nummer
    wacht tot nummer klaar is

Zou gewoon moeten werken.
Waarbij de crux is dat je in regel 3 zorgt dat je GUI niet blokkeert ;)

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!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
RobIII schreef op woensdag 24 maart 2010 @ 12:32:
[...]

Waarbij de crux is dat je in regel 3 zorgt dat je GUI niet blokkeert ;)
Het ligt er natuurlijk maar net aan wat voor applicatie het is. Ik zie nergens terug dat het over een winforms applicatie gaat ;)

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • +1 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Woy schreef op woensdag 24 maart 2010 @ 12:34:
[...]

Het ligt er natuurlijk maar net aan wat voor applicatie het is. Ik zie nergens terug dat het over een winforms applicatie gaat ;)
Touché.
* RobIII mept Woy. Betweter :(

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!

  • pasz
  • Registratie: Februari 2000
  • Laatst online: 01-09 23:08
pieter.lowie schreef op woensdag 24 maart 2010 @ 11:43:
Beste tweakers/programmeurs,

Ik werk momenteel aan een programma waarbij ik een array van mp3 bestanden mee krijg. Deze wens ik dan af te spelen. Wanneer er maar 1 bestand moet worden afgespeeld is er geen enkel probleem, wanneer ik echter 2 of meer bestanden moet afspelen dan begint hij met het afspelen van bestand1 maar meteen daarna met bestand 2 waardoor je dus enkel maar bestand 2 te horen krijgt.

Ik heb al geprobeerd om mijn programma in een lus te stoppen tot mijn bestand niet meer speelt maar dan hangt mijn programma voor onbepaalde duur en dit mag niet gebeuren.

Heb het eerst met de winmm.dll gewerkt voor geluiden af te spelen en nu met WMPLib maar deze geven telkens hetzelfde resultaat.
Ik denk dat je zelf een soort queue moet aanmaken. Speel 1 bestand af.
Wacht tot deze klaar is (krijg je geen eventje terug van WMPLib, bijv _PositionChange ?) en pak de volgende uit de queue.
Waarom ? Er is slechts 1 afspeel device. Asynchroon is genoeg.
Woy schreef op woensdag 24 maart 2010 @ 12:34:
[...]
Het ligt er natuurlijk maar net aan wat voor applicatie het is. Ik zie nergens terug dat het over een winforms applicatie gaat ;)
Goede gok, aangezien het geen web gerelateerde applicatie zal zijn ;)

woei!


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
pasz schreef op woensdag 24 maart 2010 @ 12:48:
Goede gok, aangezien het geen web gerelateerde applicatie zal zijn ;)
Dan heb je nog altijd GUI-less projecten (CLI of een service (for heaven's sake ik hoop dat dat hier niet het geval is :X :P ) of...). Neemt niet weg dat m'n gok waarschijnlijk wel juist is. Maar goed; iets met assumptions en fuckups :P

[ Voor 13% gewijzigd door RobIII op 24-03-2010 12:50 ]

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!

  • Korben
  • Registratie: Januari 2001
  • Laatst online: 13-07 01:53

Korben

() => {};

Als je WMPLib gebruikt kun je ook events afhandelen. Probeer voor de gein eens de PlayStateChange event af te handelen en daar op te reageren.

Dan wordt je pseudo-code dus zo:

code:
1
2
3
4
5
6
7
8
Start:
   Maak WMPLib-object aan
   Koppel event handler aan WMPLib-object
   Start afspelen volgende item

Event handler:
   Als nieuwe status == wmppsMediaEnded:
      Start afspelen volgende item

[ Voor 5% gewijzigd door Korben op 24-03-2010 13:14 ]

.oisyn: Échte programmeurs haten PHP met een passie. Ben jij soms geen echte programmeur?


Acties:
  • 0 Henk 'm!

  • Grompie
  • Registratie: Maart 2010
  • Laatst online: 15-04-2024
Woy schreef op woensdag 24 maart 2010 @ 12:34:
[...]

Het ligt er natuurlijk maar net aan wat voor applicatie het is. Ik zie nergens terug dat het over een winforms applicatie gaat ;)
Het gaat idd over een windows form applicatie.
Woy schreef op woensdag 24 maart 2010 @ 12:28:
Mijn glazen bol is kapot, en je geeft dus echt te weinig informatie om je te helpen. Je zult minstens even moeten laten zien ( doormiddel van een klein stukje voorbeeld code ) hoe je op dit moment je muziek af wil spelen.

code:
1
2
3
voor alle nummer in array
    start nummer
    wacht tot nummer klaar is

Zou gewoon moeten werken.
Dit was ook de allereerste manier waarop ik te werk ging maar dan zit mijn hele applicatie weer te wachten en worden er dingen uitgesproken zonder dat de gebruiker de geschreven tekst kan zien. (Nogal erg complex om uit te leggen waarom dit zo is aangezien het project nogal groot is).
pasz schreef op woensdag 24 maart 2010 @ 12:48:
[...]


Ik denk dat je zelf een soort queue moet aanmaken. Speel 1 bestand af.
Wacht tot deze klaar is (krijg je geen eventje terug van WMPLib, bijv _PositionChange ?) en pak de volgende uit de queue.
Bedankt voor de tip zal het eens proberen met het maken van een queue. Maar mijn geluiden zal ik zoiezo in een thread moeten afspelen niet? anders zal men applicatie opnieuw staan wachten.

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
pieter.lowie schreef op woensdag 24 maart 2010 @ 13:16:
[...]
Dit was ook de allereerste manier waarop ik te werk ging maar dan zit mijn hele applicatie weer te wachten en worden er dingen uitgesproken zonder dat de gebruiker de geschreven tekst kan zien. (Nogal erg complex om uit te leggen waarom dit zo is aangezien het project nogal groot is).
Dan moet je je inderdaad gaan verdiepen in threading of de muziek asynchroon afspelen ( Wat natuurlijk ook met threading te maken heeft ). Het makkelijkst is waarschijnlijk om gewoon gebruik te maken van de BackgroundWorker class als je het al voor elkaar hebt om nummers blocking af te spelen

[ Voor 4% gewijzigd door Woy op 24-03-2010 13:23 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Korben
  • Registratie: Januari 2001
  • Laatst online: 13-07 01:53

Korben

() => {};

Woy schreef op woensdag 24 maart 2010 @ 13:20:
[...]

Dan moet je je inderdaad gaan verdiepen in threading of de muziek asynchroon afspelen
Als je WMPLib de muziek laat afspelen, dan gebeurt dat ook asynchroon aangezien Windows Media Player de muziek afspeelt, niet jouw applicatie.

.oisyn: Échte programmeurs haten PHP met een passie. Ben jij soms geen echte programmeur?


Acties:
  • 0 Henk 'm!

  • Grompie
  • Registratie: Maart 2010
  • Laatst online: 15-04-2024
Ok, ik kreeg alles tot nu toe vlotjes werkende en idd het werkt volledig asynchroon dus threading hoeft hier helemaal niet. Ik krijg nu zoals het moet eerst men eerste bestand te horen dat ik wil afspelen. Daarna zie ik dat hij een event oproept wanneer het bestand is afgespeelt en begint hij aan het afspelen van bestand2. Wanneer ik echter mijn url wijzig van mijn bestand (bij bestand2) dan springt hij opnieuw naar de eventhandler en nog eens terug maar krijg ik mijn bestand2 niet meer te horen. Voorlopig heb ik nog niet uitgetest wat het heeft met meer dan 2 bestanden maar ik vermoed hier hetzelfde resultaat.

Ziet er iemand soms waar ik in de fout ga of gebruik ik mss de verkeerde eventhandler?

C#:
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
public class Audio
{
private string path;
private int soundCount;
private string[] sounds;
private WMPLib.WindowsMediaPlayer wPlayer;

public Audio(string path)
{
this.path = path;
this.soundCount = 0;
wPlayer = null;
}

public void PlaySounds(string[] audioFiles)
{
this.sounds = (string[])audioFiles;
wPlayer = new WMPLib.WindowsMediaPlayer();
wPlayer.settings.autoStart = false;

wPlayer.PlayStateChange += new WMPLib._WMPOCXEvents_PlayStateChangeEventHandler(wPlayerStateChanged);

playNextSound();
}

private void playNextSound()
{
try
{
if (sounds[soundCount] != null)
{
wPlayer.URL = path + "\\" + sounds[soundCount];
wPlayer.controls.play();
soundCount++;
}
}
catch { }
}

private void wPlayerStateChanged(int NewState)
{
if ((WMPLib.WMPPlayState)NewState == WMPLib.WMPPlayState.wmppsMediaEnded)
{
wPlayer.controls.stop();
playNextSound();
}
}
}

Acties:
  • 0 Henk 'm!

  • roy-t
  • Registratie: Oktober 2004
  • Laatst online: 08-09 11:33
Als je de WMPLib gebruikt kun je ook gewoon een playlist maken, playlist in WP pleuren, klaar is kees :).

~ Mijn prog blog!


Acties:
  • 0 Henk 'm!

  • ThaStealth
  • Registratie: Oktober 2004
  • Laatst online: 11-09 10:19
Waarschijnlijk doe je iets niet goed bij het terug in de start status brengen van de player

let er ook even op dat deze code:

C#:
1
2
3
4
5
6
if (sounds[soundCount] != null)
{
wPlayer.URL = path + "\\" + sounds[soundCount];
wPlayer.controls.play();
soundCount++;
} 


je meestal een out of range exception zal geven aangezien je een array niet termineert met null. Je kan beter op de lengte kijken met bijv:

C#:
1
while (soundCount < sounds.Length)

Mess with the best, die like the rest


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
pieter.lowie schreef op woensdag 24 maart 2010 @ 14:53:
Ziet er iemand soms waar ik in de fout ga of gebruik ik mss de verkeerde eventhandler?
Je hangt een event aan PlayStateChange maar checkt niet wat de state is. Mijn gok is dat dat event geraised wordt wanneer de play start, stopt, gepauzeerd wordt etc. En dan is het nogal wiedes dat het niet werkt zoals je wil. Je wil namelijk alleen wanneer een bestand afgelopen is een volgend bestand spelen, niet bij élke playstatechange.
Ik kijk er langs, je kijkt wel naar de playstate. Je hebt sowieso nogal een ranzige manier (waarom een try/catch in PlayNextSound bijv. :X ) van coden, en ik zou ook eens code gaan indenten als ik jou was.

[ Voor 16% gewijzigd door RobIII op 24-03-2010 15:03 ]

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!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
RobIII schreef op woensdag 24 maart 2010 @ 15:00:
[...]
(waarom een try/catch in PlayNextSound bijv. :X
Ja een check of je index nog wel binnen de bounds van een array vallen is een stuk handiger.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Woy schreef op woensdag 24 maart 2010 @ 15:16:
[...]

Ja een check of je index nog wel binnen de bounds van een array vallen is een stuk handiger.
Of gebruik een queue/stack... of... Whatever je kiest, een try/catch is gewoon... not-done om 't netjes te zeggen :P

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!

  • Grompie
  • Registratie: Maart 2010
  • Laatst online: 15-04-2024
Ok, bedankt iedereen voor de input heb kunnen een "degelijke" oplossing kunnen bedenken".
werk nu ook met de playlist zoals roy-t voorstelde waarvoor dank _/-\o_ .
Op de opmerking van de try catch, hij stond er nog een beetje slordig in van men vorige testen en was volledig nutteloos. maar die s != null staat erin omdat het wel delijk mogelijk is dat er een null in de string array kan staan en deze er niet uitgefilterd mag worden.

Hopelijk is deze code nog nuttig voor iemand :)

C#:
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
public class Audio
{
private string path;
private int soundCount;
private string[] sounds;
private WMPLib.WindowsMediaPlayer wPlayer;

public Audio(string path)
{
this.path = path;
this.soundCount = 0;
wPlayer = null;
}

public void PlaySounds(object audioFiles)
{
this.sounds = (string[])audioFiles;
wPlayer = new WMPLib.WindowsMediaPlayer();
wPlayer.settings.autoStart = false;

foreach (string s in sounds)
{
if (s != null)
{
WMPLib.IWMPMedia m1 = wPlayer.newMedia(path + "\\" + s);
wPlayer.currentPlaylist.appendItem(m1);
}
}

wPlayer.controls.play();
}

Acties:
  • 0 Henk 'm!

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 23:59

TeeDee

CQB 241

En als string s nu "" bevat in plaats van null? (M.a.w.: pak de string.IsNullOrEmpty).

Heart..pumps blood.Has nothing to do with emotion! Bored


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
TeeDee schreef op donderdag 25 maart 2010 @ 00:01:
En als string s nu "" bevat in plaats van null? (M.a.w.: pak de string.IsNullOrEmpty).
En wat als de string verwijst naar een niet bestaand bestand? Of wat als de string ongeldige tekens bevat waarmee het filesystem niet mee overweg kan? Of wat als de string verwijst naar een bestaand bestand dat beschadigd is of van een verkeerd formaat? Of...

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!

  • Korben
  • Registratie: Januari 2001
  • Laatst online: 13-07 01:53

Korben

() => {};

RobIII schreef op donderdag 25 maart 2010 @ 00:36:
[...]
En wat als de string verwijst naar een niet bestaand bestand? Of wat als de string ongeldige tekens bevat waarmee het filesystem niet mee overweg kan? Of wat als de string verwijst naar een bestaand bestand dat beschadigd is of van een verkeerd formaat? Of...
... of wat als de aarde tijdens het afspelen verwikkelt raakt in een nucleaire oorlog?! Seriously, robuustheid is één ding, maar vertrouwen hebben in bepaalde voorwaarden is toch wel een redelijke vereiste bij het ontwikkelen van elke applicatie. Zoals dat de waarden in die array ofwel leeg/null zijn ofwel wijzen naar een geldig .mp3-bestand.

.oisyn: Échte programmeurs haten PHP met een passie. Ben jij soms geen echte programmeur?


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Korben schreef op donderdag 25 maart 2010 @ 06:35:
Zoals dat de waarden in die array ofwel leeg/null zijn ofwel wijzen naar een geldig .mp3-bestand.
Of zoals dat de array geen leeg/null values bevat. Your point is?

Ik spreek liever af (lees: design by contract) dat de array allemaal valid values moet hebben (voor zover mogelijk) als dat de array valid values of leeg/null moet bevatten. Het maakt je contract er niet duidelijker op. Een leeg/null value is nét zo "invalid" als een value die "FP)h9@(_&*#H_R&*(H@_(#&*H" of "C:\this\file\does\not\exist.mp3" of "C:\oma.jpg" bevat.

[ Voor 45% gewijzigd door RobIII op 25-03-2010 09:31 ]

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!

  • Grompie
  • Registratie: Maart 2010
  • Laatst online: 15-04-2024
RobIII schreef op donderdag 25 maart 2010 @ 00:36:
[...]

En wat als de string verwijst naar een niet bestaand bestand? Of wat als de string ongeldige tekens bevat waarmee het filesystem niet mee overweg kan? Of wat als de string verwijst naar een bestaand bestand dat beschadigd is of van een verkeerd formaat? Of...
Kijken of het bestand wel bestaat gebeurd nog voor ik de audio class oproep. de string kan dus niet leeg of ongeldige tekens bevaten ;) . Controleer ook liefst op zoveel mogelijk fouten en maak men code zo veilig mogelijk maar zoals in dit geval weet ik wel heel precies wat er gebeurd en vond het dan ook onnodig om hier meters code te plaatsen op het forum.
toch bedankt voor de vele tips, ben nog niet zo heel erg lang aan de slag als programmeur en leer elke dag met plezier bij :).
Pagina: 1