44,1 Khz Routine unter Win2k ohne DMA Betrieb! möglich ??



  • Hallo!

    Ich weiss nicht obs in dieses Forum passt, deshalb schreib ichs auch noch woanders. -> asm Forum

    Ich arbeite momentan intensiv an meiner Studienarbeit und habe eine ISA Karte
    gebastelt mit einem 8Mhz µC (68HC12) und will nun diese Karte mit
    Sounddaten füttern in einer Geschwindigkeit von mind. 44,1 Khz (über den ISA Bus natürlich).
    Ich habe mich schon etwas mit der Treiberprogrammierung auseinandergesetzt,
    jedoch ist mir das Schreiben eines Soundtreibers (Kernel Streaming), der ja
    den DMA Controller anspricht, etwas zu anspruchsvoll und vor allem zeitaufwendig.

    Deshalb die Frage an euch: Kann ich das Problem umgehen (vereinfachen) indem ich einen Trick anwende und den PIT auf eine höhere Basisfrequenz programmiere (ich weiss wie das geht) und dann auf die WinAPI Funktion SetTimer() zurückgreife, die ja standardmäßig nur bis zu 1ms einstellbar ist ?? (ich geh mal davon aus dass SetTimer() über IRQ0 gesteuert wird)
    Nachteil: Sehr benutzerunfreundlich da ganzes Betriebssystem um Faktor 44 schneller läuft 😛 (wäre mir aber im schlimmsten falle egal)

    Oder den Prozessortakt auslesen (geht das über CLK_TCK ? siehe time.h ??)
    und dann ein manuelles delay programmieren in abhängigkeit des Taktes ?

    Oder habe ich da unter Windows 0 chance ohne DMA egal wie ichs hinbieg...

    was meint ihr ??

    MFG
    Stephan



  • Also, den Timer kannst du da erstmal knicken, der ist zu Ungenau, und schon gar nicht
    1ms, auch wenn du das Angiebts. Windows bietet aber ne möglichkeit die Daten
    des performanceCounters der CPU auszulesen, darüber erhälst du schon genauere Werte, für eine Konstante Frequenz, kämme dies aber auch noch nicht na genug,
    somit wäre über Assembler wohl die besere Lösung.
    Denoch, solltest du das über den PerformanceCounter versuchen, giebt es 2 Funktionenen, eine die den zyklus zählt und eine die die Frequens des Zählers
    angiebt "QueryPerformanceCounter()" und "QueryPerformanceFrequency()", beide
    erwarten einen zeiger zu einem LARGE_INTEGER.



  • hi

    was meinst du mit "über assembler wäre es besser" ?
    mit assembler kann ich unter win2k effektiv auch nicht mehr machen als mit C ...
    ausser dass das Programm kleiner ist und schneller. oder meintest du was anderes ?

    hmm, das mit dem performance counter, hab jetzt grad keine möglichkeit es zu testen, aber das ist ja nur ein zähler, aber kein timer.. wenn ich das aus der msdn richtig verstanden habe.

    ich könnte hochstens sowas in der art machen, is jetzt nur ein gedankenfetzen aus meinem kopf.. : 🙂

    // .. treiber.sys öffnen
    //.. wav datei öffnen z.b. CreateFile()
    
    while(playsound)
    {
        QueryPerformanceCounter(&start);
        z++;  //dummy befehl
        QueryPerformanceCounter(&ende);
        time = time+(ende-start);
        if(time >= TAKT)
        {
            iotreiber_outw(Daten[x], MEINE_IO_ADRESSE);
            x++;
        }
    }
    

    hätte man auch ne möglichkeit den zählerstand abzufragen, ohne den zähler dabei
    zu unterbrechen ??



  • Bitte keine Crossposts: http://www.c-plusplus.net/forum/viewtopic.php?t=90362

    Dort wurde schon gesagt, dass PerformanceCounter dir wahrscheinlich nicht helfen. Der Scheduler von Windows unterbricht deinen Prozess regelmäßig, sodass du niemals genau 44,1kHz hinbekommst.

    hätte man auch ne möglichkeit den zählerstand abzufragen, ohne den zähler dabei
    zu unterbrechen ??

    QueryPerformanceCounter() unterbricht den Zähler doch nicht?

    edit:

    Hammer schrieb:

    Ich weiss nicht obs in dieses Forum passt, deshalb schreib ichs auch noch woanders.

    Crossposts sind eigentlich immer unerwünscht. Wenn ein Thread überhaupt nicht in ein bestimmtes Forum passt, wird er schon verschoben werden. 🙄
    Du könntest im Asm-Forum-Thread auch schreiben, dass du dich vertan hast und es in die WinAPI gehört. Oder du suchst weiter eine Assembler-Lösung.


Anmelden zum Antworten