Laden...

Forenbeiträge von AyrA Ingesamt 60 Beiträge

21.08.2012 - 20:48 Uhr

Eine EULA betrifft den End User.

End User des DirectX SDKs ist der Entwickler, der Nutzer hat lediglich die Runtime.
Die Lizenzen der Runtime sind hier: DirectX 9.0c - End-User EULAs

Ob die Lizenz, die Microsoft hier "weiterreicht" und rechtlich wasserdicht ist, sollte man bei rechtlichen Bedenken immer durch einen spezialisierten Anwalt prüfen lassen.

Falsch, für die Korrektheit einer Lizenz ist der Aussteller verantwortlich. Als End Nutzer habe ich das Recht diese zu prüfen, nicht aber die Pflicht. Wenn du an eine Lizenz kommst, darfst du davon ausgehen, dass diese OK ist. Sollte Microsoft eine Komponente in einer EULA an einen Nutzer weiterlizenzieren und dürfte das nicht, so ist Microsoft haftbar. Als End Nutzer kenne ich ja die Lizenzbedingungen zwischen Microsoft und dessen zulieferern nicht. Bei DirectX besteht die Gefahr zwar nicht, ist aber nie schlecht zu wissen.

Fest steht aber, dass ein Entwickler kein End User ist.

Vom Entwicker SDK schon.

"An Dich weiter lizenziert" ist womöglich rechtlich der falsche Ausdruck.

Relizenzierung wäre glaube ich der richtige Ausdruck.

19.08.2012 - 03:16 Uhr

schade, ich dacht hier wäre irgendwie ne eigene mp3 implementierung am werk...

Das eigene implementeren eines MP3 decoders könnte lizenztechnische Probleme nach sich ziehen. MP3 ist kein freies Format und (wenn ich mich nicht täusche) sogar patentiert. Nur weil die MPEG Group keine Rechtlichen Schritte gegen nicht lizenzierte en-/decoder unternimmt heisst das nicht, dass sie es nie tun werden. Es gibt viele MP3 Decoder source Codes in C und C++, die man nach C# porten könnte, wenn man dringend einen braucht. Des weiteren kann man Patente im Internet einsehen und daher auch den Aufbau des Codecs, wenn man einen eigenen Decoder schreiben möchte. Ich wollte jedoch eine Lösung, die mich nicht vor Lizenzprobleme stellt. Durch verwenden des Microsoft internen DirectX Decoders ist Microsoft für die Lizenzierung zuständig, da sie über die EULA die DirectX Managed Komponente an mich weiter Lizenziert.
Der DirectX Versuch von mir lädt einiges schneller als der Media Player Core. Habe damit mittlerweile schon ein komplettes Webradio mit HTTP stream realisiert. Für den Media Player Ansatz müsste man auf einem Windows Server diverse zusatzdienste installieren (Windows Vista Desktop Experience) was mir etwas viel ist, nur um die WMP API nutzen zu können. Die managed DLLs von DirectX hingegen sind nur wenige MB gross.

10.08.2012 - 16:30 Uhr

Kompilierte DLL im Anhang

Einmal als AnyCPU kompiliert und einmal als x86.

Der Hammer wäre natürlich der Quellcode...

OK. Source der DLL ist ziemlich einfach und lediglich eine einzlne Klasse:

using Microsoft.DirectX.AudioVideoPlayback;
using System.Collections.Generic;
using System;
using System.Threading;
using System.IO;

namespace AyrA.Media
{
    /// <summary>
    /// This class Provides simple Audio Playback.
    /// Formats depend on Codecs
    /// </summary>
    public class QuickPlayer : IDisposable
    {
        private bool disposed = false;
        private Audio snd;

        /// <summary>
        /// Returns the Position in Seconds of the current Playback
        /// </summary>
        public double Position
        {
            get
            {
                return snd.CurrentPosition;
            }
            set
            {
                if (value <= snd.Duration && value>=0)
                {
                    snd.CurrentPosition = value;
                }
            }
        }

        /// <summary>
        /// Returns the Length of the current Song
        /// </summary>
        public double Length
        {
            get
            {
                try
                {
                    return snd.Duration;
                }
                catch
                {
                    return -1.0;
                }
            }
        }

        /// <summary>
        /// Returns current Volume Min: -10000, Max: 0
        /// </summary>
        public int Volume
        {
            get
            {
                try
                {
                    return snd.Volume;
                }
                catch
                {
                    return 0;
                }
            }
            set
            {
                if (value <= 0 && value >= -10000)
                {
                    snd.Volume = value;
                }
            }
        }

        /// <summary>
        /// Stops Playback and disposes the Component
        /// </summary>
        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);
        }

        /// <summary>
        /// Disposes the Component
        /// </summary>
        /// <param name="disposing"></param>
        protected virtual void Dispose(bool disposing)
        {
            if (!disposed)
            {
                if (disposing)
                {
                    snd.Stop();
                    snd.Dispose();
                }
                //Free your own state (unmanaged objects).
                //Set large fields to null.
                disposed = true;
            }
        }

        /// <summary>
        /// Disposes the Component
        /// </summary>
        ~QuickPlayer()
        {
            //Simply call Dispose(false).
            Dispose (false);
        }

        /// <summary>
        /// Initializes a new Quick Player
        /// </summary>
        public QuickPlayer()
        {
        }

        /// <summary>
        /// Initializes a new Quick Player and starts Playback
        /// </summary>
        /// <param name="File">File to play</param>
        public QuickPlayer(string File)
        {
            Play(File);
        }

        /// <summary>
        /// Seeks forward or backward
        /// </summary>
        /// <param name="d">Seconds to seek</param>
        public void Seek(double d)
        {
            if (snd.CurrentPosition + d < snd.Duration && snd.CurrentPosition + d > 0)
            {
                snd.CurrentPosition += d;
            }
        }

        /// <summary>
        /// Plays specified File, cancelling an existing Playback
        /// </summary>
        /// <param name="File">File to play</param>
        public void Play(string File)
        {
            if (snd != null)
            {
                lock (snd)
                {
                    int vol = snd.Volume;
                    try
                    {
                        snd.Open(File, true);
                    }
                    catch
                    {
                    }
                    snd.Volume = vol;
                }
            }
            else
            {
                snd = new Audio(File);
                snd.Play();
            }
        }

        /// <summary>
        /// Stops current Playback
        /// </summary>
        public void Stop()
        {
            snd.Stop();
        }

        /// <summary>
        /// Pauses or resumes Playback
        /// </summary>
        public void Pause()
        {
            if (snd.Paused)
            {
                snd.Play();
            }
            else
            {
                snd.Pause();
            }
        }

        /// <summary>
        /// Restarts current Song
        /// </summary>
        public void Restart()
        {
            snd.SeekCurrentPosition(0.0, SeekPositionFlags.AbsolutePositioning);
        }
    }
}

Referenz auf die Microsoft.DirectX.AudioVideoPlayback.DLL ist notwendig!

hier auf meinem alten Laptop noch mit WinXP (ohne DirectX), ist mir gleich eine Riesen Exception um die Ohren geflogen

Interessant, als ich auf meinem Laptop das .NET 2.0 Package installiert hatte kamen die DirectX DLLs gleich mit. auf meinem alten PC mit Windows ME funktioniert es auch.

Und das man über eine Datei ft.txt im Anwendungsverzeichnis die erlaubten Extensions verwalten kann, kannst du auch schreiben.

Ist aber nicht sehr bequem, da du das Programm neu laden musst, damit es Wirkung zeigt. Grundsätzlich halte ich dies nicht für erwähnenswert, sofern im Programm eine Funktion zur Editierung vorhanden ist, aber das ist Ansichtssache

10.08.2012 - 00:48 Uhr

Screenshot Hauptfenster.

Das ist echt dumm, hierfür 3 Posts erstellen zu müssen.

10.08.2012 - 00:47 Uhr

Screenshot 2:
Einstellungsfenster

10.08.2012 - 00:46 Uhr

Beschreibung:

Es handelt sich hier um einen MP3 Player. Dieser wurde komplett in C# geschrieben und besitzt folgende interessante Eigenschaften:

  1. Keine DLL. Die Anwendung ist nicht von Drittherstellern abhängig (LAME.DLL, etc)
  2. Keine WinAPI oder unmanaged Code. Alles ist in reinem C# geschrieben und greift nicht auf native Code Resourcen zurück (z.B. winmm.dll)

Screenshot:
siehe Anhang

Wissenswerte Informationen:

.NET Version: 2.0

Das Programm spielt auch weitere Formate ab (wav, wma, ogg). Dies ist primär abhängig vom installierten Codec, dadurch lassen sich sogar Audio Tracks von Videodateien abspielen. Dateierweiterungen kann man mit dem Edit Button konfigurieren

Tastatursteuerung:
[ESC] Beenden
[->] 3 Sekunden vor
[<-] 3 Sekunden zurück
[^] Lauter
[v] Leiser
[SPACE] pause
[HOME] Song Neustart (auch Taste [R] möglich)

Single Instance mit Inter Process Communication.
Läuft bereits eine instanz, wird die bestehende gezeigt und keine neue geladen. Versucht man mit der neuen Instanz eine Datei zu öffnen, wird sie stattdessen in der ersten geöffnet.

Startparameter support. Das Programm kann direkt mit einer MP3 Datei geöffnet werden.

Drag & Drop support. Einfach eine Datei in das Viereck ziehen um den Abspielvorgan zu starten.

Songs werden im Repeat Modus gespielt.

Die Progress Bar ändert die Farbe von Grün (0%) über Gelb (50%) nach Rot (100%). Dies ist kein Eigenes Control sondern eine standard Progressbar

========

Das Programm wurde von mir geschrieben um schnell Musikdateien vorhören zu können, ohne einen riesen Player zu laden. Deswegen ist z.B. kein Playlist Support vorhanden. Die Anwendung muss möglichst schnell starten und ist deswegen auch relativ klein (ca. 28 KB).
Am effektivsten arbeitet das Tool wenn ein Kontextmenu Handler registriert wird.

Bin gerne für Erweiterungsvorschläge offen.


So wird ein Kontextmenu handler registriert, wer einen haben will:
[list]
[*]Registry Editor öffnen ([WIN]+[R], [B]REGEDIT.EXE[/B])
[*]navigieren nach [B]HKEY_CLASSES_ROOT\*\shell[/B]
[*]Hier einen Schlüssel durch Rechtsklick auf [B]shell[/B] anlegen (Name: [B]QuickPlay[/B])
[*]Diesem Schlüssel nun rechts den Standardwert setzen. (Dieser Text wird im Kontextmenü gezeigt). z.B: [B]&Quick Play[/B] (das & ist beabsichtigt und macht, dass im Kontextmenü das Q unterstrichen ist und der Punkt über die Q Taste zugänglich wird)
[*]Einen Unterschlüssel mit dem Namen [B]command[/B] erstellen
[*]Den Standardwert setzen auf (inkl Anführungszeichen): [B]"PFAD\ZUR.EXE" "%1"[/B], natürlich müsst ihr hier den Pfad anpassen.
[*]Registry Editor schliessen. Änderungen sind sofort wirksam
[/list]
Das Entfernen des ersten angelegten Schlüssels (in Punkt 3) entfernt den Kontextmenu handler.

Die Anwendung ist digital signiert um unautorisierte Änderungen zu verhindern.

Wenn jemand Interesse an einer DLL zum Einbinden hat stelle ich gerne eine zur Verfügung

15.02.2011 - 10:24 Uhr

Folgendes Problem:
Habe 2 Monitore, auf dem Hauptmonitor läuft ein ediaplayer, der 2. Monitor ist ein Touch Screen mit einer C# App, die Befehle an den Mediaplayer sendet quasi als Fernbeienung)
Problem: wenn auf der App ein Button geklickt wird, dann wird die App aktiviert und unten im Media Player ist die Taskbar dann sichtbar.
Ich müsste es nun hinbekommen, dass meine App gar nicht erst den Fokus bekommt, wie in etwa die Bildschirmtastatur (osk.exe) ist das irgendwie möglich?

06.10.2010 - 19:54 Uhr

Habe den Netzwerkkartentreiber aktualisiert und jetzt funktioniert es. Danke

24.09.2010 - 11:15 Uhr

Dann poste doch bitte erstmal die Exeption, und ggf. InnerExceptions.

ich bin gerade bei der Arbeit, habe kein Visual Studio zur Hand, aber die exception ist die selbe wie wenn du versuchst mit einem socket daten an das gegenüber zu senden, das sich mittlerweile getrennt hat, da sich die Netzwerkkarte ja verabschieded entsteht nach ca. 20 sekunden ein Verbindungstimeout

und bei mir hat alles einmampfrei 😃 funktioniert ...

Update evtl. mal deinen Netzwerkkarten treiber hatte mal so ein ähnliches Problem mit einer Karte.

btw. witzige Idee mit dem Terminal Player 😄

Darfst den Code gerne verwenden. Ich schaue mal, ob ich neue Treiber finde.
Finde es toll, dass es funktioniert, hatte schon angst, dass das Media Player Plugin nur bei mir funktioniert.

23.09.2010 - 22:53 Uhr

Hallo Community

ich habe folgendes Problem:
Der angehängte Code ist eine C# Konsolenapplikation, die einen Media Player darstellt, der durch Telnet gesteuert wird.

Wie ihr dem Code entnehmen könnt ist das Socket Handling nicht gerade schön, jedoch auch nicht zu schlimm, dennoch gibt es ein Problem: Wenn man auf den Client verbindet, dann kratzt die Netzwerkverbindung ab (nicht die Applikation).
Die Netzwerkkarte hat dann noch die IP und alles aber tut so als hätte der Hersteller vergessen sie zu bauen und in den PC zu stecken. Nichts geht mehr, auch die Ip mittels ipconfig release und renew erneuern funktioniert nicht, man muss den Netzwerkstecker ziehen und wieder einstecken, damit der Adapter wieder funktioniert.
Wenn man lokal verbindet (auf Localhost oder die eigene IP) funktioniert es tadellos. Ich habe das Projekt seit ich meinen Computer frisch aufgesetzt habe noch nie berührt, vorher hat jedoch alles wunderbar geklappt.
Betriebssystem: Windows XP pro VLK SP3.

Ich habe bewusst das Projekt unkompiliert beigelegt, da noch dieVariable PATH im program.cs angepasst werden muss. wem der Port 23 nicht zusagt möge diesen im clsTelnet.cs gleich ändern.
Ich weiss nicht inwifern sich der Fehler reproduzieren lässt und ob der Fehler von der Netzwerkkarte her kommt oder von der Applikation, auf jeden fall funktionieren andere Programme die Verbindungen akzeptieren hervorragend.
So wie es bei mir aussieht setzt die Netzwerkverbindung sofort nach dem verbinden aus, den anti Virus und die Firewall deaktivieren hat auch nichts gebracht.
Die Anwendung rennt dann ins catch in der SendString Methode weil die Verbindung zum client nicht mehr steht, er das aber erst so nach 20 sekunden oder mehr merkt.

Ich möchte nicht vom Telnet abweichen und JA, ich habe versucht den Computer aus und wieder einzuschalten, habe sogar das ganze Heimnetzwerk heruntergefahren und es tut sich nichts.