Author: nyadav Date: Thu Jun 9 23:06:06 2011 New Revision: 52167
URL: http://svn.reactos.org/svn/reactos?rev=52167&view=rev Log: [AUDSRV] mixer routine for signed 16 bit data
Modified: branches/nyadav-audio-branch/base/services/audsrv/audsrv.c branches/nyadav-audio-branch/base/services/audsrv/audsrv.h branches/nyadav-audio-branch/base/services/audsrv/mixer.c branches/nyadav-audio-branch/base/services/audsrv/stream.c branches/nyadav-audio-branch/drivers/wdm/audio/backpln/audclient/audclient.c branches/nyadav-audio-branch/include/reactos/libs/audsrv/audsrvapi.h
Modified: branches/nyadav-audio-branch/base/services/audsrv/audsrv.c URL: http://svn.reactos.org/svn/reactos/branches/nyadav-audio-branch/base/service... ============================================================================== --- branches/nyadav-audio-branch/base/services/audsrv/audsrv.c [iso-8859-1] (original) +++ branches/nyadav-audio-branch/base/services/audsrv/audsrv.c [iso-8859-1] Thu Jun 9 23:06:06 2011 @@ -159,7 +159,7 @@ MixAndFill(MixerEngine * mixer, int buffer) { - while(WaitForSingleObject(mixer->streampresent, + while(WaitForSingleObject(mixer->newStreamEvent, 100) != 0) { if(mixer->dead) @@ -583,7 +583,7 @@ FALSE, NULL);
- pengine->streampresent=CreateEvent(NULL, + pengine->newStreamEvent=CreateEvent(NULL, TRUE, FALSE, NULL); @@ -625,7 +625,7 @@ pengine->masterbuf[1] = NULL; pengine->played=CreateEvent(NULL,FALSE,FALSE,NULL); pengine->filled=CreateEvent(NULL,FALSE,FALSE,NULL); - pengine->streampresent=CreateEvent(NULL,TRUE,FALSE,NULL); + pengine->newStreamEvent=CreateEvent(NULL,TRUE,FALSE,NULL); SetConsoleCtrlHandler(Close,TRUE); SpawnMixerThread(pengine); SpawnPlayerThread(pengine);
Modified: branches/nyadav-audio-branch/base/services/audsrv/audsrv.h URL: http://svn.reactos.org/svn/reactos/branches/nyadav-audio-branch/base/service... ============================================================================== --- branches/nyadav-audio-branch/base/services/audsrv/audsrv.h [iso-8859-1] (original) +++ branches/nyadav-audio-branch/base/services/audsrv/audsrv.h [iso-8859-1] Thu Jun 9 23:06:06 2011 @@ -69,7 +69,7 @@ long streamidpool; HANDLE played; HANDLE filled; - HANDLE streampresent; + HANDLE newStreamEvent; HANDLE mixerthread; HANDLE playerthread; HANDLE rpcthread;
Modified: branches/nyadav-audio-branch/base/services/audsrv/mixer.c URL: http://svn.reactos.org/svn/reactos/branches/nyadav-audio-branch/base/service... ============================================================================== --- branches/nyadav-audio-branch/base/services/audsrv/mixer.c [iso-8859-1] (original) +++ branches/nyadav-audio-branch/base/services/audsrv/mixer.c [iso-8859-1] Thu Jun 9 23:06:06 2011 @@ -14,9 +14,58 @@ } void * MixS16(MixerEngine * mixer,int buffer) { - mixer->masterbuf[buffer] = HeapAlloc(GetProcessHeap(), 0, mixer->serverstreamlist->length_filtered); + int length=0; + short minsamplevalue,maxsamplevalue; + float coefficient = 1.0; + int streamcount = 0,i; + PSHORT localsinkbuf,localsrcbuf; + ServerStream * stream = mixer->serverstreamlist; + + /*TODOAssert(mixer->serverstreamlist == NULL)*/ + + /*Find the Longest Buffer within all ServerStreams*/ + length = stream->length_filtered; + while(stream->next != NULL) + { + if(stream->length_filtered > length && stream->ready == TRUE ) + length = stream->length_filtered; + stream = stream->next; + } + + /*Allocate MasterBuffer*/ + mixer->masterbuf[buffer] = HeapAlloc(GetProcessHeap(), 0, length); + localsinkbuf = mixer->masterbuf[buffer]; + mixer->bytes_to_play = length; + + /*Perform Actual Mixing*/ + stream = mixer->serverstreamlist; + minsamplevalue = *(short *) stream->minsamplevalue; + maxsamplevalue = *(short *) stream->maxsamplevalue; + while(stream->next != NULL) + { + localsrcbuf = stream->filteredbuf; + if(stream->ready == TRUE ) + { + if( *(short *)stream->maxsamplevalue != maxsamplevalue || + *(short *)stream->minsamplevalue != minsamplevalue ) + { + if( (float) maxsamplevalue / (float)*(short *)stream->maxsamplevalue < + (float) minsamplevalue / (float)*(short *)stream->minsamplevalue ) + coefficient = (float) maxsamplevalue / (float)*(short *)stream->maxsamplevalue; + else + coefficient = (float) minsamplevalue / (float)*(short *)stream->minsamplevalue; + + for(i=0;i<stream->length_filtered;i++) + { + localsinkbuf[i] = (short) (( (localsinkbuf[i] * streamcount) + ((short)((float) localsrcbuf[i] ) * coefficient) ) / (streamcount +1)); + } + } + } + stream->ready = 0; + streamcount++; + stream = stream->next; + } CopyMemory(mixer->masterbuf[buffer],mixer->serverstreamlist->filteredbuf,mixer->serverstreamlist->length_filtered); - mixer->bytes_to_play = mixer->serverstreamlist->length_filtered;
return NULL; }
Modified: branches/nyadav-audio-branch/base/services/audsrv/stream.c URL: http://svn.reactos.org/svn/reactos/branches/nyadav-audio-branch/base/service... ============================================================================== --- branches/nyadav-audio-branch/base/services/audsrv/stream.c [iso-8859-1] (original) +++ branches/nyadav-audio-branch/base/services/audsrv/stream.c [iso-8859-1] Thu Jun 9 23:06:06 2011 @@ -192,7 +192,7 @@ localstream = localstream->next; localstream->next = newstream; } - SetEvent(pengine->streampresent); + SetEvent(pengine->newStreamEvent); return newstream->streamid;
error:
Modified: branches/nyadav-audio-branch/drivers/wdm/audio/backpln/audclient/audclient.c URL: http://svn.reactos.org/svn/reactos/branches/nyadav-audio-branch/drivers/wdm/... ============================================================================== --- branches/nyadav-audio-branch/drivers/wdm/audio/backpln/audclient/audclient.c [iso-8859-1] (original) +++ branches/nyadav-audio-branch/drivers/wdm/audio/backpln/audclient/audclient.c [iso-8859-1] Thu Jun 9 23:06:06 2011 @@ -12,6 +12,9 @@
#include <audsrvapi.h> #include <stdio.h> +#include <debug.h> +#include <windows.h> +#include <winbase.h>
void OpenComplete (int error ); void BufferCopied (int error ); @@ -28,7 +31,7 @@ DWORD WINAPI RunAudioThread(LPVOID param) { ClientStream * localstream = (ClientStream *) param; - playaudio(localstream); + PlayAudio(localstream);
return 0; } @@ -45,7 +48,6 @@ } void PlayComplete (int error ) { - OutputDebugStringA("Playback Completed\n"); } int __cdecl @@ -55,11 +57,11 @@ DWORD dwID; HANDLE audiothread = NULL; char input='\0'; - OutputDebugStringA("ReactOS Audio Mixer Sample Client.Enter 'a' to Stop.\n"); + printf("ReactOS Audio Mixer Sample Client.Enter 'a' to Stop.\n"); //if (clientstream->callbacks.OpenComplete == NULL || clientstream->callbacks.BufferCopied == NULL || clientstream->callbacks.PlayComplete == NULL) printf("");
/*[out]HANDLE * streamhandle,[in] long frequency,[in] int number of channels,[in] int bitspersample,[in]ULONG channelmask,[in] int volume,[in] int mute,[in] float balance*/ - error = initstream ( &clientstream , + error = InitStream ( &clientstream , 44100 , 2 , 16 , @@ -71,20 +73,17 @@
if ( error ) { - OutputDebugStringA("Failed to Initialize Stream.Error \n"); goto error; } else { - OutputDebugStringA("StreamID : %ld\n",clientstream.stream); audiothread = CreateThread(NULL,0,RunAudioThread,&clientstream,0,&dwID); }
while ( input != 'a' ) scanf("%c",&input);
- OutputDebugStringA("Stoping Audio Stream.\n"); - stopaudio(&clientstream); + StopAudio(&clientstream); WaitForSingleObject(audiothread,INFINITE);
return 0;
Modified: branches/nyadav-audio-branch/include/reactos/libs/audsrv/audsrvapi.h URL: http://svn.reactos.org/svn/reactos/branches/nyadav-audio-branch/include/reac... ============================================================================== --- branches/nyadav-audio-branch/include/reactos/libs/audsrv/audsrvapi.h [iso-8859-1] (original) +++ branches/nyadav-audio-branch/include/reactos/libs/audsrv/audsrvapi.h [iso-8859-1] Thu Jun 9 23:06:06 2011 @@ -24,7 +24,7 @@ } ClientStream;
/********************API Functions******************/ -WINAPI int initstream (ClientStream * clientstream, +WINAPI int InitStream (ClientStream * clientstream, LONG frequency, int channels, int bitspersample, @@ -34,8 +34,8 @@ int mute, float balance);
-WINAPI int playaudio ( ClientStream * clientstream); -WINAPI int stopaudio (ClientStream * clientstream ); +WINAPI int PlayAudio ( ClientStream * clientstream); +WINAPI int StopAudio (ClientStream * clientstream );
WINAPI int Volume(ClientStream * clientstream, int * volume );