[DirectX.Net] Managed DirectX, events

Pagina: 1
Acties:
  • 128 views sinds 30-01-2008
  • Reageer

  • Lethalis
  • Registratie: April 2002
  • Niet online
Ave!

Ik heb een hele simpele CLI MP3 player gebouwd, maar om de 1 of andere vage reden krijg ik geen event wanneer hij klaar is met spelen.

De code:

code:
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
using System;

using Microsoft.DirectX;
using Microsoft.DirectX.AudioVideoPlayback;

namespace MP3Play {

  public class clMP3 {
    
    [STAThread]
    public static void Main(string[] Args) {
      
      try {
        clMP3Player t = new clMP3Player(Args[0]);
        t.Play();
      } catch(Exception E)
      {
        Console.WriteLine(E.Message);
      }
      
      Console.ReadLine();
    }
  }
  
  public class clMP3Player
  {
    private Audio audio;
    
    public clMP3Player(string FileName)
    {
      
      try {
        Console.WriteLine("Opening.. {0}", FileName);
        audio = new Audio(FileName);
        Console.WriteLine("File loaded!");
        Console.WriteLine("Duration: {0}", audio.Duration);
      }
      catch(Exception E)
      {
        Console.WriteLine(E.Message);
      }
      
    }
    
    public void Play()
    {
      audio.Ending += new System.EventHandler(this.AudioEnded);
      audio.Play();
      Console.WriteLine("Playing mp3..");
    }
    
    private void AudioEnded(object sender, System.EventArgs e)
    {
      Console.WriteLine("Audio ended..");
      if (audio != null)
      {
        Console.WriteLine("Do repeat!");
        audio.Stop();
        audio.Play();
      }
    }
    
  }
}


De gebruikte build.bat:
code:
1
2
3
4
5
6
7
8
9
10
11
@ECHO OFF

ECHO C# Windows Application Build - by M. Schlechter
ECHO -----------------------------------------------

ECHO Setting PATH to include C# compiler..
SET PATH=%PATH%;C:\WINNT\Microsoft.NET\Framework\v1.1.4322

ECHO Compiling..
csc.exe /r:Microsoft.DirectX.dll /r:Microsoft.DirectX.DirectSound.dll 
/r:Microsoft.DirectX.AudioVideoPlayback.dll /target:exe /out:mp3play.exe *.cs


Ik heb de DLL's in dezelfde map gezet btw.

Het probleem is dat het programma dus nooit in de AudioEnded method komt, terwijl dat wel zo hoort bij het Audio.Ending event. Oftewel: het Ending event wordt niet geraised, maar ik weet niet waarom :(

Heb andere voorbeeldcode gedownload en die werkt wel, met dezelfde compilerflags en dezelfde DLL's, dus het moet aan de code liggen. Ik kan me alleen niet voorstellen waaraan.

Bij voorbaat dank :)

[ Voor 3% gewijzigd door Lethalis op 09-04-2004 14:57 ]

Ask yourself if you are happy and then you cease to be.


  • Lethalis
  • Registratie: April 2002
  • Niet online
Het maakt overigens niet uit of ik het toevoegen van het event in de constructor of in de Play method doe (ik weet zelf dat het netter in de constructor is maarjah).

[edit]
Het enige verschil tussen het werkende programma en het mijne is dat ik geen window geopend heb.

*stelt zich de vraag of EventHandlers ook werken bij console applicaties*

[ Voor 36% gewijzigd door Lethalis op 09-04-2004 15:05 ]

Ask yourself if you are happy and then you cease to be.


  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 21-05 14:59

pjvandesande

GC.Collect(head);

Neemt AudioEnded wel die arguments aan. Heb even geen toegang tot resources hier. Sorry, maar de code ziet er verder goed uit.

  • Lethalis
  • Registratie: April 2002
  • Niet online
questa schreef op 09 april 2004 @ 15:09:
Neemt AudioEnded wel die arguments aan. Heb even geen toegang tot resources hier. Sorry, maar de code ziet er verder goed uit.
Ja, de arguments kloppen wel.

Ik bedenk me alleen net dat het zou kunnen zijn dat events alleen via window messages geraised worden, en wanneer er geen window geopend is, er dus geen message is en ook geen event.

Maar ik wil juist wel een CLI speler bouwen en er later zelfs een service van maken die random muziek in de achtergrond afspeelt.

Ask yourself if you are happy and then you cease to be.


  • EfBe
  • Registratie: Januari 2000
  • Niet online
En als je [STAThread] eens weghaalt? Tenslotte is het een multi-threaded app. Play() start een nieuwe thread.

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


  • Lethalis
  • Registratie: April 2002
  • Niet online
EfBe schreef op 09 april 2004 @ 15:38:
En als je [STAThread] eens weghaalt? Tenslotte is het een multi-threaded app. Play() start een nieuwe thread.
Helaas, geen verschil.

Ask yourself if you are happy and then you cease to be.


  • Lethalis
  • Registratie: April 2002
  • Niet online
Ik heb de [STAThread] verwijderd en ik heb in de Main() de declaratie van t buiten mijn try-block gezet ivm een evt out-of-scope, maar dit heeft allemaal ook geen effect.

Laatste code:
code:
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
using System;

using Microsoft.DirectX;
using Microsoft.DirectX.AudioVideoPlayback;

namespace MP3Play {

  public class clMP3 {
    
    public static void Main(string[] Args) {
      
      clMP3Player t;
      
      try {
        t = new clMP3Player(Args[0]);
        t.Play();
      }
      catch(Exception E)
      {
        Console.WriteLine(E.Message);
      }
      
      Console.ReadLine();
    }
  }
  
  public class clMP3Player
  {
    private Audio audio;
    
    public clMP3Player(string FileName)
    {
      
      try {
        Console.WriteLine("Opening.. {0}", FileName);
        
        audio = new Audio(FileName);
        audio.Ending += new System.EventHandler(AudioEnded);
        
        Console.WriteLine("File loaded!");
        Console.WriteLine("Duration: {0}", audio.Duration);
      }
      catch(Exception E)
      {
        Console.WriteLine(E.Message);
      }
      
    }
    
    public void Play()
    {
      audio.Play();
      Console.WriteLine("Playing mp3..");
    }
    
    private void AudioEnded(object sender, System.EventArgs e)
    {
      Console.WriteLine("Audio ended..");
      if (audio != null)
      {
        Console.WriteLine("Do repeat!");
        audio.Stop();
        audio.Play();
      }
    }
    
  }
}

Ask yourself if you are happy and then you cease to be.


  • Lethalis
  • Registratie: April 2002
  • Niet online
Ghehe, ik heb hem!!!

Voor de events is een messageloop nodig, welke je kan maken door Application.Run() te gebruiken:

code:
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
using System;

using System.Windows.Forms;

using Microsoft.DirectX;
using Microsoft.DirectX.AudioVideoPlayback;

namespace MP3Play {

  public class clMP3 {
    
    public static void Main(string[] Args) {
      
      try {
        clMP3Player t = new clMP3Player(Args[0]);
        t.Play();
        
        Application.Run(); // start messageloop voor applicatie!!
      }
      catch(Exception E)
      {
        Console.WriteLine(E.Message);
      }
    }
  }
  
  public class clMP3Player
  {
    private Audio audio;
    
    public clMP3Player(string FileName)
    {
      
      try {
        Console.WriteLine("Opening.. {0}", FileName);
        
        audio = new Audio(FileName);
        audio.Ending += new System.EventHandler(AudioEnded);
        
        Console.WriteLine("File loaded!");
        Console.WriteLine("Duration: {0}", audio.Duration);
      }
      catch(Exception E)
      {
        Console.WriteLine(E.Message);
      }
      
    }
    
    public void Play()
    {
      audio.Play();
      Console.WriteLine("Playing mp3..");
    }
    
    private void AudioEnded(object sender, System.EventArgs e)
    {
      Console.WriteLine("Audio ended..");
      if (audio != null)
      {
        Console.WriteLine("Do repeat!");
        audio.Stop();
        audio.Play();
      }
    }
    
  }
}


Draadje kan dicht :)

Ask yourself if you are happy and then you cease to be.

Pagina: 1