Page 1 of 2

Supporto AUDIO ( a partire dalla 0.38 )

Posted: Tue Feb 24, 2009 1:46 am
by Davy Bartoloni
Scusate, apro un nuovo Topic, un po' piu' generico ( quello riguardo i driver Creative era ormai un miscuglio d' ogni.. http://www.reactos.org/forum/viewtopic.php?f=15&t=6429 ) riguardante gli sviluppi dell' AUDIO a partire dalla 0.38...

Il commit quotato da Ey3.. riguardava all' emissione di un suono di TEST ( non un file WAV reale ) ... posto il codice relativo al player di TEST.. che si trova al momento in:
\reactos\drivers\wdm\audio\backpln\audio_test\audio_test.c

Code: Select all

#define _UNICODE
#define UNICODE
#include <windows.h>
#include <mmsystem.h>
#include <stdio.h>
#include <math.h>

#define _2pi                6.283185307179586476925286766559

#include <ks.h>
#include <ksmedia.h>
#include "interface.h"

int
__cdecl
main(int argc, char* argv[])
{
    ULONG Length;
    PSHORT SoundBuffer;
    ULONG i = 0;
    BOOL Status;
    OVERLAPPED Overlapped;
    DWORD BytesReturned;
    HANDLE hWdmAud;
    WDMAUD_DEVICE_INFO DeviceInfo;


    hWdmAud = CreateFileW(L"\\\\.\\wdmaud",
                          GENERIC_READ | GENERIC_WRITE,
                          0,
                          NULL,
                          OPEN_EXISTING,
                          FILE_FLAG_OVERLAPPED,
                          NULL);
     if (!hWdmAud)
     {
         printf("Failed to open wdmaud with %lx\n", GetLastError());
         return -1;
     }

     printf("WDMAUD: opened\n");
     /* clear device info */
     RtlZeroMemory(&DeviceInfo, sizeof(WDMAUD_DEVICE_INFO));

     ZeroMemory(&Overlapped, sizeof(OVERLAPPED));
     Overlapped.hEvent = CreateEventW(NULL, FALSE, FALSE, NULL);

     DeviceInfo.DeviceType = WAVE_OUT_DEVICE_TYPE;


     Status = DeviceIoControl(hWdmAud, IOCTL_GETNUMDEVS_TYPE, (LPVOID)&DeviceInfo, sizeof(WDMAUD_DEVICE_INFO), (LPVOID)&DeviceInfo, sizeof(WDMAUD_DEVICE_INFO), &BytesReturned, &Overlapped);

     if (!Status)
     {
         if (WaitForSingleObject(&Overlapped.hEvent, 5000) != WAIT_OBJECT_0)
         {
            printf("Failed to get num of wave out devices with %lx\n", GetLastError());
            CloseHandle(hWdmAud);
            return -1;
         }
     }

     printf("WDMAUD: Num Devices %lu\n", DeviceInfo.DeviceCount);
     if (!DeviceInfo.DeviceCount)
     {
        CloseHandle(hWdmAud);
        return 0;
    }

    DeviceInfo.u.WaveFormatEx.cbSize = sizeof(WAVEFORMATEX);
    DeviceInfo.u.WaveFormatEx.wFormatTag = 0x1; //WAVE_FORMAT_PCM;
    DeviceInfo.u.WaveFormatEx.nChannels = 2;
    DeviceInfo.u.WaveFormatEx.nSamplesPerSec = 48000;
    DeviceInfo.u.WaveFormatEx.nBlockAlign = 4;
    DeviceInfo.u.WaveFormatEx.nAvgBytesPerSec = 48000 * 4;
    DeviceInfo.u.WaveFormatEx.wBitsPerSample = 16;

    Status = DeviceIoControl(hWdmAud, IOCTL_GETCAPABILITIES, (LPVOID)&DeviceInfo, sizeof(WDMAUD_DEVICE_INFO), (LPVOID)&DeviceInfo, sizeof(WDMAUD_DEVICE_INFO), &BytesReturned, &Overlapped);

    if (!Status)
    {
        if (WaitForSingleObject(&Overlapped.hEvent, 5000) != WAIT_OBJECT_0)
        {
           printf("Failed to get iocaps %lx\n", GetLastError());
        }
    }


     Status = DeviceIoControl(hWdmAud, IOCTL_OPEN_WDMAUD, (LPVOID)&DeviceInfo, sizeof(WDMAUD_DEVICE_INFO), &DeviceInfo, sizeof(WDMAUD_DEVICE_INFO), &BytesReturned, &Overlapped);
     if (!Status)
     {
         if (WaitForSingleObject(&Overlapped.hEvent, 5000) != WAIT_OBJECT_0)
         {
             printf("Failed to open device with %lx\n", GetLastError());
             CloseHandle(hWdmAud);
             return -1;
         }
     }




    //
    // Allocate a buffer for 1 second
    //
    Length = 48000 * 4;
    SoundBuffer = (PSHORT)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, Length);

    //
    // Fill the buffer with a 500 Hz sine tone
    //
    while (i < Length / 2)
    {
        //
        // Generate the wave for each channel:
        // Amplitude * sin( Sample * Frequency * 2PI / SamplesPerSecond )
        //
        SoundBuffer[i] = 0x7FFF * sin(0.5 * (i - 1) * 500 * _2pi / 48000);
        i++;
        SoundBuffer[i] = 0x7FFF * sin((0.5 * i - 2) * 500 * _2pi / 48000);
        i++;
    }

    DeviceInfo.State = KSSTATE_RUN;
    Status = DeviceIoControl(hWdmAud, IOCTL_SETDEVICE_STATE, (LPVOID)&DeviceInfo, sizeof(WDMAUD_DEVICE_INFO), &DeviceInfo, sizeof(WDMAUD_DEVICE_INFO), &BytesReturned, &Overlapped);
    if (!Status)
    {
         if (WaitForSingleObject(&Overlapped.hEvent, 5000) != WAIT_OBJECT_0)
         {
             printf("Failed to set device into run state %lx\n", GetLastError());
             CloseHandle(hWdmAud);
             return -1;
         }
    }
    
    //
    // Play our 1-second buffer
    //
    DeviceInfo.Buffer = (PUCHAR)SoundBuffer;
    DeviceInfo.BufferSize = Length;
    Status = DeviceIoControl(hWdmAud, IOCTL_WRITEDATA, (LPVOID)&DeviceInfo, sizeof(WDMAUD_DEVICE_INFO), &DeviceInfo, sizeof(WDMAUD_DEVICE_INFO), &BytesReturned, &Overlapped);
    if (!Status)
    {
         if (WaitForSingleObject(&Overlapped.hEvent, 5000) != WAIT_OBJECT_0)
         {
             printf("Failed to play buffer %lx\n", GetLastError());
             CloseHandle(hWdmAud);
             return -1;
         }
    }

    printf("WDMAUD:  Played buffer\n");

    DeviceInfo.State = KSSTATE_STOP;
    Status = DeviceIoControl(hWdmAud, IOCTL_SETDEVICE_STATE, (LPVOID)&DeviceInfo, sizeof(WDMAUD_DEVICE_INFO), &DeviceInfo, sizeof(WDMAUD_DEVICE_INFO), &BytesReturned, &Overlapped);
    if (!Status)
    {
         if (WaitForSingleObject(&Overlapped.hEvent, 5000) != WAIT_OBJECT_0)
         {
             printf("Failed to set device into stop state %lx\n", GetLastError());
             CloseHandle(hWdmAud);
            return -1;
         }
    }
    printf("WDMAUD:  STOPPED\n");
    CloseHandle(hWdmAud);
    CloseHandle(&Overlapped.hEvent);
    printf("WDMAUD:  COMPLETE\n");
    return 0;
}

Re: Supporto AUDIO ( a partire dalla 0.38 )

Posted: Tue Feb 24, 2009 3:09 pm
by Ey3
Proporrei, oltre alla normale discussione sull'audio, che se qualcuno vede dei commit degni di nota relativi all'argomento in questo topic trattato, li quoti qua, in modo che possano rimanere (anche perchè io non ho ancora trovato modo di vedere i commit più vecchi di un tot... e quindi a volte me ne perdo qualcuno).

Re: Supporto AUDIO ( a partire dalla 0.38 )

Posted: Tue Feb 24, 2009 3:47 pm
by DivXMan
Ho visto questo link sul forum Inglese:
http://stuff.silverblade.co.uk/reactos/

Tra le altre cose è presente una sorta di RoadMap per lo sviluppo dell'audio.

Re: Supporto AUDIO ( a partire dalla 0.38 )

Posted: Fri Feb 27, 2009 3:00 pm
by Francesco19
non ho capito...
quel programma emette un suono audio virtualizzato?

Re: Supporto AUDIO ( a partire dalla 0.38 )

Posted: Fri Feb 27, 2009 6:17 pm
by Ey3
janderwald wrote: * Add sanity checks
* Fix memory leaks
* Implement enumerating devices for wave in devices
* Implement mapping virtual device id to real filter id and pin id
* Wdmaud can now select the correct pin
* Complete missing irp
* Handle all properties of KSPROPSETID
* Initialize filter properties in a deferred routine
* Add more error checks
* Ignore the failure of device interface registration as a audio might not have been initialized yet
* Disable checking of nonactive device interface because the code is not working yet (IoSetDeviceInterfaceState requires more work)
* Change service type of RosAudioSrv to automatically start when an audio adapter is installed
* Also start RosAudioSrv
* Start automatically sysaudio / wdmaud when audiosrv is started
* Implement CMP_RegisterNotification stubs
* Fixes audiosrv crash
Ho unito un po' di commit recenti tra ieri e oggi dello zelante janderwald :)

Re: Supporto AUDIO ( a partire dalla 0.38 )

Posted: Fri Feb 27, 2009 10:45 pm
by Davy Bartoloni
Quel programma genera una forma d'onda adatta ad essere riprodotta ( prendendola dalla memoria ) in formato WAV..

nel codice la creazione avviene usando un SENO ( non quello delle femmine ), quindi creando una forma d'onda sinusoidale... ovvero , quella che produrrebbe uno strumento a CORDE ( una chitarra.. un liuto )

ecco una linea che descrive il metodo di creazione:

Code: Select all

        SoundBuffer[i] = 0x7FFF * sin(0.5 * (i - 1) * 500 * _2pi / 48000);
con il "SENO" hihi

diciamo lo stesso principio che distingue un "CAMPIONATORE" da un "SINTETIZZATORE" .... ottimo Ey3.. posta di tanto in tanto questi "RESOCONTI" che ci eviti di scartabellare nei commit :)

Re: Supporto AUDIO ( a partire dalla 0.38 )

Posted: Sun Mar 01, 2009 11:33 pm
by Davy Bartoloni
Scusate il doppio Reply...

nulla.. l'ho gia' scritto nel topic della distro... ma mirrorizzo qua'...
ho l'idea che la SB16 emulata dal QEMU sia "diversa" da quella del VMWARE ( per VBOX nn so quale delle 2 possa essere..ma penso quella del Vmware )
le 2 versioni si distinguono, per la mancanza del PnP ( che difatti all' epoca POTEVA esserci.. o POTEVA NON ESSERCI ).. e forse pure dal tipo di COnenssione. ( ISA E PCI )

quella del Qemu.. per esempio deve essere forzata cm driver... ( pure su XP... e provoca una mancanza di ZITTIMENTO al termine di un Play... come facevano proprio le ISA alcuni secoli fa ).. mentre su VBOX playa normalmente ( in XP ).. ora... visto che fino ad ORA il Preloaded e' stato per QEMU.. dormo tranquillo e' "SO" che nn potra' accadere che il qemu nn possa supportare la prima versione di ROS+AUDIO... ma contemporaneamente, sapendo che chi sviluppa usa Vmware... ho paura che il "porting" per la SB16 del QEMU venga fatto in extremis... prima del rilascio della 0.39... quindi.. in ritardo...

Boh.. mi raccomando chi LEGGE QUALCOSA o SCOPRE QUALCOSA su novita' AUDIO.. POSTI!

Re: Supporto AUDIO ( a partire dalla 0.38 )

Posted: Mon Mar 02, 2009 10:25 pm
by lumo
@ Davy:
Per quanto riguarda la "riproduzione" di segnali audio , confermo che le schede audio di vmware e Qemu sono diverse come suono prodotto (e quella emulata da QEMU ti fà saltare dalla sedia :lol: ).

Invece su Virtualbox non si può ancora sentire niente (o almeno io che ho una realtek integrata nella scheda madre non ci riesco) ...le schede audio che fa sono finte :( (il SO virtuale la vede , ma non c'è nessuna interazione con l' hardware reale del pc)

Re: Supporto AUDIO ( a partire dalla 0.38 )

Posted: Mon Mar 02, 2009 10:30 pm
by RobertoAlbano
Invece su Virtualbox non si può ancora sentire niente (o almeno io che ho una realtek integrata nella scheda madre non ci riesco) ...le schede audio che fa sono finte (il SO virtuale la vede , ma non c'è nessuna interazione con l' hardware reale del pc)
Quoto, uso VirtualBox 2.1.4 e... nessun risultato :(

Re: Supporto AUDIO ( a partire dalla 0.38 )

Posted: Mon Mar 02, 2009 10:56 pm
by Davy Bartoloni
Ahhh.. e beh.. buono a sapersi.. cmq ho visto che su Qemu ( per lo meno la versione ricompilata di Febbraio che useremo per React-IT ).. la scheda SB16 viene vista cm multimedia audio device per fortuna... :) e mi sta venendo il dubbio che la fantomatica system-device.. sia invece il controller USB... ( ma di questo nn ne sn assolutamenet sicuro.. nn ho fatto ancora prove )

Re: Supporto AUDIO ( a partire dalla 0.38 )

Posted: Mon Mar 02, 2009 11:32 pm
by Ey3
Vai Davy! Tanto lo so che andrai avanti fino alle 2.... quindi dommattina darò un'occhiata qua per vedere i tuoi risultati :D :mrgreen: :mrgreen:

Re: Supporto AUDIO ( a partire dalla 0.38 )

Posted: Wed Mar 04, 2009 11:26 pm
by Davy Bartoloni
12 min ago ReactOS
Commit by janderwald :: r39877 reactos/drivers/wdm/audio/ (7 files in 3 dirs):

* Start implementing kmixer
ottimo!

Re: Supporto AUDIO ( a partire dalla 0.38 )

Posted: Wed Mar 04, 2009 11:51 pm
by lumo
kmixer ?? spero che non sia di Kde (implementarlo sarebbe un problema) ... :lol:

Re: Supporto AUDIO ( a partire dalla 0.38 )

Posted: Sat Mar 07, 2009 1:25 am
by Davy Bartoloni
19:14 today ReactOS
Commit by janderwald :: r39894 reactos/dll/win32/wdmaud.drv/wdmaud.c:

* Fix a few issues to open wdmaud / write to
* Under lucky circunstances, you might be able to now to play an mp3 with winamp ;)

Re: Supporto AUDIO ( a partire dalla 0.38 )

Posted: Sat Mar 07, 2009 5:31 pm
by Ey3
Wowowowoowowow! :mrgreen: :mrgreen: :mrgreen: :shock: :shock: :shock: :shock: :shock: 8) 8) 8) 8)