Laden...

DirectX.AudioVideoPlayback und Playlist

Erstellt von turndevil vor 19 Jahren Letzter Beitrag vor 18 Jahren 3.165 Views
T
turndevil Themenstarter:in
41 Beiträge seit 2004
vor 19 Jahren
DirectX.AudioVideoPlayback und Playlist

Hallo Leute.

Mit folgendem Code will ich eine Playlist realisieren (wohlgemerkt ist die noch lange nicht fertig). In meiner Hauptklasse wird ein Objekt PlayList erzeugt. Die Files werden dann über Add() als Strings in die Playlist geschrieben. Durch die PlayFrom() Methode erzeuge ich aus dem String am gewünschten Index ein AudioVideoPlayback.Audio Objekt. Das bekommt noch nen EvenHandler und den Playbefehl.

Wenn ich aber nun draussen in meinem Form einen anderen TreeNode (also ein anderes Lied) anwähle, stoppt er das alte nicht. OK, manche würden sagen: AudioStop()...du Idiot. Aber das funzt nicht. habs auf mehreren Wegen probiert.

using System;
using System.Collections;
using Microsoft.DirectX.AudioVideoPlayback;

namespace MediaCenter
{
	/// <summary>
	/// Summary description for PlayList.
	/// </summary>
	public class PlayList: ArrayList
	{
		private int selIndex = 0;
		
		public PlayList()
		{
		}

		public void PlayFrom(int index)
		{	
			this.selIndex = index; 
			
			Audio currentSong = new Audio(this[index].ToString(), false);
			currentSong.Ending += new System.EventHandler(this.CurrentSong_Ending);
			
			currentSong.Play();
		}

		private void CurrentSong_Ending(object sender, EventArgs e)
		{
			try
			{
				PlayFrom(this.selIndex + 1);
			}
			catch(Exception exc)
			{
				String message = exc.Message;
				PlayFrom(0);
			}
		}
	}
}

Hier nochmal der Code, mit dem die Playlist bearbeitet wird.

private void AudioAct_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
		{
			if(e.KeyCode == Keys.Escape)
			{
				this.audioAct.Visible = false;
				this.treeView1.Focus();
			}
			else if(e.KeyCode == Keys.Space)
			{
				if(this.audioAct.SelectedItem.ToString() == "Play File")
				{
					pl.Clear();
					pl.Add(new FileInfo(Functions.GetGenrePath("AudioRoot", appRun) + @"\" + this.treeView1.SelectedNode.FullPath));
					
					pl.PlayFrom(0);
				}
				else if(this.audioAct.SelectedItem.ToString() == "Play Album")
				{
					pl.Clear();
					DirectoryInfo album = new DirectoryInfo(Functions.GetGenrePath("AudioRoot", appRun) + @"\" + this.treeView1.SelectedNode.Parent.FullPath);

					pl.AddRange(album.GetFiles());

					pl.PlayFrom(0);					
				}
			}
		}

Also irgendwas stimmt da nicht. Ich probier aber schon ewig rum und komm nicht drauf. Naja ihr werdet das Schiff schon schaukeln und ich bin ja auch noch nicht am Ende gg.
Vielen Dank schonmal im Voraus. Sollten noch Fragen bestehen, einfach posten.

mfg
tom

X
36 Beiträge seit 2004
vor 19 Jahren

hmm ich hab atm genau dasselbe problem...das video haelt an aber der ton geht weiter.

habs auch mit



Video videoobj = new ...

videoobj.Audio.Stop();


versucht aber hat nicht funktioniert.

irgendwie is da der wurm drin

X
36 Beiträge seit 2004
vor 19 Jahren

ok ich habs!

versuch mal deine audio instanz so zu initialisieren...



Audio aobj;

if(aobj == null)
         aobj = new Audio(bla bla, bla);

...


T
turndevil Themenstarter:in
41 Beiträge seit 2004
vor 19 Jahren

aha
ok ich versuchs

dnake für den tipp

mfg
tom

G
14 Beiträge seit 2006
vor 18 Jahren

Hi.

Habe ein ähnliches Problem.
Das Abspielen der wave-Datei nach der Auswahl in einer Listbox funktioniert zwar,
wenn ich aber mehrere Elemente auswähle, so spielt er immer nur den die zum ersten ausgewählten Element zugehörige Wave-Datei ab.

private void listBox2_SelectedIndexChanged(object sender, EventArgs e)
{
foreach (int i in listBox2.SelectedIndices)
{

            AudioLogEntry ale = (AudioLogEntry)(listBox2.Items_);   
            ourAudio = new Audio(ale.Path);  

if (ourAudio != null)
{
ourAudio.Play();
}
}
}

was muss ich hier noch verändern?

E
265 Beiträge seit 2004
vor 18 Jahren

@turndevil
Im PlayFrom instanzierst du das Audio objekt und rufst Play auf.
Wenn du das Lied stoppen willst musst du auf der gleichen Instanz Stop() aufrufen, da die instanz nach dem aufruf von PlayFrom( .. ) verloren geht ist das nicht möglich.
Lösung: Du musst dir die Audio Instanz merken.

@Gromminger
Die foreach Schleife sieht richtig aus. Ich glaub du bist im falschen Event (SelectedIndexChanged).
Versuch mal zu test zwecken das ganze über einen ButtonClick zu starten.

G
14 Beiträge seit 2006
vor 18 Jahren

Danke für den Tip.

Habs nun gelöst:


 foreach (int i in listBox2.SelectedIndices)
            {

                if (ourAudio != null)
                {
                    while ((ourAudio.State == StateFlags.Running) && (ourAudio.CurrentPosition < ourAudio.Duration) )
                    {
                        System.Threading.Thread.Sleep(15);
                        System.Windows.Forms.Application.DoEvents();
                    }
                }
                AudioLogEntry ale = (AudioLogEntry)(listBox2.Items[i]); 
                ourAudio = new Audio(ale.Path);
                if (ourAudio != null)
                {
                    ourAudio.Play();
                }
            }

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo Gromminger,

bitte bei längerem und eingerücktem Code [****CSHARP][/csharp] verwenden.

herbivore