[ros-diffs] [nyadav] 52167: [AUDSRV] mixer routine for signed 16 bit data

nyadav at svn.reactos.org nyadav at svn.reactos.org
Thu Jun 9 23:06:06 UTC 2011


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/services/audsrv/audsrv.c?rev=52167&r1=52166&r2=52167&view=diff
==============================================================================
--- 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/services/audsrv/audsrv.h?rev=52167&r1=52166&r2=52167&view=diff
==============================================================================
--- 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/services/audsrv/mixer.c?rev=52167&r1=52166&r2=52167&view=diff
==============================================================================
--- 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/services/audsrv/stream.c?rev=52167&r1=52166&r2=52167&view=diff
==============================================================================
--- 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/audio/backpln/audclient/audclient.c?rev=52167&r1=52166&r2=52167&view=diff
==============================================================================
--- 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/reactos/libs/audsrv/audsrvapi.h?rev=52167&r1=52166&r2=52167&view=diff
==============================================================================
--- 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 );




More information about the Ros-diffs mailing list