Jack2 1.9.6

JackWinNamedPipeServerNotifyChannel.cpp

00001 /*
00002 Copyright (C) 2004-2006 Grame
00003 
00004 This program is free software; you can redistribute it and/or modify
00005   it under the terms of the GNU General Public License as published by
00006   the Free Software Foundation; either version 2 of the License, or
00007   (at your option) any later version.
00008 
00009   This program is distributed in the hope that it will be useful,
00010   but WITHOUT ANY WARRANTY; without even the implied warranty of
00011   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00012   GNU General Public License for more details.
00013 
00014   You should have received a copy of the GNU General Public License
00015   along with this program; if not, write to the Free Software
00016   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
00017 
00018 */
00019 
00020 #include "JackWinNamedPipeServerNotifyChannel.h"
00021 #include "JackError.h"
00022 #include "JackRequest.h"
00023 #include "JackConstants.h"
00024 #include "JackNotification.h"
00025 
00026 namespace Jack
00027 {
00028 
00029 int JackWinNamedPipeServerNotifyChannel::Open(const char* server_name)
00030 {
00031     if (fRequestPipe.Connect(jack_server_dir, server_name, 0) < 0) {
00032         jack_error("Cannot connect to server pipe");
00033         return -1;
00034     } else {
00035         return 0;
00036     }
00037 }
00038 
00039 void JackWinNamedPipeServerNotifyChannel::Close()
00040 {
00041     fRequestPipe.Close();
00042 }
00043 
00044 /*
00045 The requirement is that the Notification from RT thread can be delivered... not sure using a pipe is adequate here...
00046 Can the write operation block?
00047 A non blocking write operation shoud be used : check if write can succeed, and ignore the notification otherwise
00048 (since its mainly used for XRun, ignoring a notification is OK, successive XRun will come...)
00049 */
00050 void JackWinNamedPipeServerNotifyChannel::Notify(int refnum, int notify, int value)
00051 {
00052     JackClientNotificationRequest req(refnum, notify, value);
00053     if (req.Write(&fRequestPipe) < 0) {
00054         jack_error("Could not write request ref = %d notify = %d", refnum, notify);
00055     }
00056 }
00057 
00058 void JackWinNamedPipeServerNotifyChannel::NotifyQuit()
00059 {
00060     JackClientNotificationRequest req(-1, kQUIT, 0);
00061     if (req.Write(&fRequestPipe) < 0) {
00062         jack_error("Could not write request ref = %d notify = %d", -1, kQUIT);
00063     }
00064 }
00065 
00066 } // end of namespace
00067 
00068