Francois Gouget : wineesd.drv: Build a unique name so we can identify our stream.

Alexandre Julliard julliard at winehq.org
Mon Mar 30 12:08:43 CDT 2009


Module: wine
Branch: master
Commit: 45a59683585fa3991c7bab37e42d9b9525bae147
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=45a59683585fa3991c7bab37e42d9b9525bae147

Author: Francois Gouget <fgouget at codeweavers.com>
Date:   Sat Mar 28 11:26:39 2009 +0100

wineesd.drv: Build a unique name so we can identify our stream.

Put the windows application name in it to make it user friendly as it is displayed by EsounD mixers.

---

 dlls/wineesd.drv/audio.c |   45 +++++++++++++++++++++++++++++++++++----------
 1 files changed, 35 insertions(+), 10 deletions(-)

diff --git a/dlls/wineesd.drv/audio.c b/dlls/wineesd.drv/audio.c
index 1b7d5fb..d0eed60 100644
--- a/dlls/wineesd.drv/audio.c
+++ b/dlls/wineesd.drv/audio.c
@@ -165,6 +165,7 @@ typedef struct {
     DWORD			dwSleepTime;		/* Num of milliseconds to sleep between filling the dsp buffers */
 
     /* esd information */
+    char*			stream_name;		/* a unique name identifying the esd stream */
     int				stream_fd;		/* the socket fd we get from esd when opening a stream for playing */
 
     char*			sound_buffer;
@@ -198,6 +199,7 @@ typedef struct {
     char                        interface_name[32];
 
     /* esd information */
+    char*			stream_name;		/* a unique name identifying the esd stream */
     int				stream_fd;		/* the socket fd we get from esd when opening a stream for recording */
 
     LPWAVEHDR			lpQueuePtr;
@@ -391,12 +393,35 @@ static void copy_format(LPWAVEFORMATEX wf1, LPWAVEFORMATPCMEX wf2)
         memcpy(wf2, wf1, sizeof(WAVEFORMATEX) + wf1->cbSize);
 }
 
+static char* get_stream_name(const char* direction, unsigned int dev_id)
+{
+    char exename[MAX_PATH];
+    char *basename, *s;
+    char* stream_name;
+
+    GetModuleFileNameA(NULL, exename, sizeof(exename));
+    exename[sizeof(exename)-1]='\0';
+    basename = s = exename;
+    while (*s)
+    {
+        if (*s == '/' || *s == '\\')
+            basename = s+1;
+        s++;
+    }
+
+    stream_name = HeapAlloc(GetProcessHeap(), 0, 4+strlen(basename)+10+strlen(direction)+10+1);
+    sprintf(stream_name, "%s (%lu:%s%u)", basename, (unsigned long)getpid(), direction, dev_id);
+
+    return stream_name;
+}
+
 /******************************************************************
  *		ESD_CloseWaveOutDevice
  *
  */
 static void	ESD_CloseWaveOutDevice(WINE_WAVEOUT* wwo)
 {
+	HeapFree(GetProcessHeap(), 0, wwo->stream_name);
 	esd_close(wwo->stream_fd);
 	wwo->stream_fd = -1;
 
@@ -412,6 +437,7 @@ static void	ESD_CloseWaveOutDevice(WINE_WAVEOUT* wwo)
  */
 static void	ESD_CloseWaveInDevice(WINE_WAVEIN* wwi)
 {
+	HeapFree(GetProcessHeap(), 0, wwi->stream_name);
 	esd_close(wwi->stream_fd);
 	wwi->stream_fd = -1;
 }
@@ -1264,14 +1290,15 @@ static DWORD wodOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags)
     out_rate = (int) wwo->waveFormat.Format.nSamplesPerSec;
 	TRACE("esd output format = 0x%08x, rate = %d\n", out_format, out_rate);
 
-    wwo->stream_fd = esd_play_stream(out_format, out_rate, NULL, "wineesd");
+    wwo->stream_fd = esd_play_stream(out_format, out_rate, NULL, wwo->stream_name);
+    TRACE("wwo->stream_fd=%d\n", wwo->stream_fd);
+    if(wwo->stream_fd < 0) return MMSYSERR_ALLOCATED;
+    wwo->stream_name = get_stream_name("out", wDevID);
 
     /* clear these so we don't have any confusion ;-) */
     wwo->sound_buffer = 0;
     wwo->buffer_size = 0;
 
-    if(wwo->stream_fd < 0) return MMSYSERR_ALLOCATED;
-
     wwo->dwPlayedTotal = 0;
     wwo->dwWrittenTotal = 0;
 
@@ -1295,8 +1322,6 @@ static DWORD wodOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags)
     }
     wwo->hStartUpEvent = INVALID_HANDLE_VALUE;
 
-    TRACE("stream=%d\n", wwo->stream_fd);
-
     TRACE("wBitsPerSample=%u, nAvgBytesPerSec=%u, nSamplesPerSec=%u, nChannels=%u nBlockAlign=%u!\n",
 	  wwo->waveFormat.Format.wBitsPerSample, wwo->waveFormat.Format.nAvgBytesPerSec,
 	  wwo->waveFormat.Format.nSamplesPerSec, wwo->waveFormat.Format.nChannels,
@@ -1912,11 +1937,13 @@ static DWORD widOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags)
 	TRACE("esd input format = 0x%08x, rate = %d\n", in_format, in_rate);
 
 #ifdef WID_USE_ESDMON
-    wwi->stream_fd = esd_monitor_stream(in_format, in_rate, NULL, "wineesd");
+    wwi->stream_fd = esd_monitor_stream(in_format, in_rate, NULL, wwi->stream_name);
 #else
-    wwi->stream_fd = esd_record_stream(in_format, in_rate, NULL, "wineesd");
+    wwi->stream_fd = esd_record_stream(in_format, in_rate, NULL, wwi->stream_name);
 #endif
-    TRACE("(wwi->stream_fd=%d)\n",wwi->stream_fd);
+    TRACE("wwi->stream_fd=%d\n",wwi->stream_fd);
+    if(wwi->stream_fd < 0) return MMSYSERR_ALLOCATED;
+    wwi->stream_name = get_stream_name("in", wDevID);
     wwi->state = WINE_WS_STOPPED;
 
     if (wwi->lpQueuePtr) {
@@ -1924,8 +1951,6 @@ static DWORD widOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags)
 	wwi->lpQueuePtr = NULL;
     }
 
-    if(wwi->stream_fd < 0) return MMSYSERR_ALLOCATED;
-
     /* Set the socket to O_NONBLOCK, so we can stop recording smoothly */
     mode = fcntl(wwi->stream_fd, F_GETFL);
     mode |= O_NONBLOCK;




More information about the wine-cvs mailing list