Changeset 89541 in vbox
- Timestamp:
- Jun 7, 2021 9:26:07 AM (3 years ago)
- Location:
- trunk/src/VBox
- Files:
-
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Audio/AudioTest.cpp
r89468 r89541 292 292 } 293 293 294 295 294 /** 296 295 * Return the tag to use in the given buffer, generating one if needed. … … 302 301 * @param pszTagUser User specified tag, optional. 303 302 */ 304 int AudioTestCopyOrGenTag(char *pszTag, size_t cbTag, const char *pszTagUser)303 static int audioTestCopyOrGenTag(char *pszTag, size_t cbTag, const char *pszTagUser) 305 304 { 306 305 if (pszTagUser && *pszTagUser) … … 325 324 { 326 325 char szTag[AUDIOTEST_TAG_MAX]; 327 int rc = AudioTestCopyOrGenTag(szTag, sizeof(szTag), pszTag);326 int rc = audioTestCopyOrGenTag(szTag, sizeof(szTag), pszTag); 328 327 AssertRCReturn(rc, rc); 329 328 … … 674 673 audioTestSetInitInternal(pSet); 675 674 676 int rc = AudioTestCopyOrGenTag(pSet->szTag, sizeof(pSet->szTag), pszTag);675 int rc = audioTestCopyOrGenTag(pSet->szTag, sizeof(pSet->szTag), pszTag); 677 676 AssertRCReturn(rc, rc); 678 677 -
trunk/src/VBox/Devices/Audio/AudioTest.h
r89468 r89541 342 342 int AudioTestToneParamsInitRandom(PAUDIOTESTTONEPARMS pToneParams, PPDMAUDIOPCMPROPS pProps); 343 343 344 int AudioTestGenTag(char *pszTag, size_t cbTag); 345 344 346 int AudioTestPathGetTemp(char *pszPath, size_t cbPath); 345 347 int AudioTestPathCreateTemp(char *pszPath, size_t cbPath, const char *pszUUID); -
trunk/src/VBox/Devices/Audio/AudioTestService.cpp
r89458 r89541 143 143 Log(("atsSendPkt: cb=%#x opcode=%.8s\n", pPkt->cb, pPkt->achOpcode)); 144 144 Log2(("%.*Rhxd\n", RT_MIN(pPkt->cb, 256), pPkt)); 145 int rc = pThis->pTransport->pfnSendPkt( pClient->pTransportClient, pPkt);145 int rc = pThis->pTransport->pfnSendPkt(&pThis->TransportInst, pClient->pTransportClient, pPkt); 146 146 while (RT_UNLIKELY(rc == VERR_INTERRUPTED) && !pThis->fTerminate) 147 rc = pThis->pTransport->pfnSendPkt( pClient->pTransportClient, pPkt);147 rc = pThis->pTransport->pfnSendPkt(&pThis->TransportInst, pClient->pTransportClient, pPkt); 148 148 if (RT_FAILURE(rc)) 149 149 Log(("atsSendPkt: rc=%Rrc\n", rc)); … … 166 166 memcpy(Reply.achOpcode, pszOpcode, sizeof(Reply.achOpcode)); 167 167 168 pThis->pTransport->pfnBabble( pClient->pTransportClient, &Reply, 20*1000);168 pThis->pTransport->pfnBabble(&pThis->TransportInst, pClient->pTransportClient, &Reply, 20*1000); 169 169 } 170 170 … … 187 187 { 188 188 PATSPKTHDR pPktHdr; 189 int rc = pThis->pTransport->pfnRecvPkt( pClient->pTransportClient, &pPktHdr);189 int rc = pThis->pTransport->pfnRecvPkt(&pThis->TransportInst, pClient->pTransportClient, &pPktHdr); 190 190 if (RT_SUCCESS(rc)) 191 191 { … … 513 513 if (RT_SUCCESS(rc)) 514 514 { 515 pThis->pTransport->pfnNotifyHowdy( pClient->pTransportClient);515 pThis->pTransport->pfnNotifyHowdy(&pThis->TransportInst, pClient->pTransportClient); 516 516 pClient->enmState = ATSCLIENTSTATE_READY; 517 517 } … … 769 769 idxSlt++; 770 770 771 rc = pThis->pTransport->pfnPollSetAdd( pThis->hPollSet, pIt->pTransportClient, idxSlt + 1);771 rc = pThis->pTransport->pfnPollSetAdd(&pThis->TransportInst, pThis->hPollSet, pIt->pTransportClient, idxSlt + 1); 772 772 if (RT_SUCCESS(rc)) 773 773 { … … 777 777 else 778 778 { 779 pThis->pTransport->pfnNotifyBye( pIt->pTransportClient);779 pThis->pTransport->pfnNotifyBye(&pThis->TransportInst, pIt->pTransportClient); 780 780 atsClientDestroy(pIt); 781 781 } … … 783 783 else 784 784 { 785 pThis->pTransport->pfnNotifyBye( pIt->pTransportClient);785 pThis->pTransport->pfnNotifyBye(&pThis->TransportInst, pIt->pTransportClient); 786 786 atsClientDestroy(pIt); 787 787 } … … 801 801 { 802 802 /* Close connection and remove client from array. */ 803 rc = pThis->pTransport->pfnPollSetRemove( pThis->hPollSet, pClient->pTransportClient, uId);803 rc = pThis->pTransport->pfnPollSetRemove(&pThis->TransportInst, pThis->hPollSet, pClient->pTransportClient, uId); 804 804 AssertRC(rc); 805 805 806 pThis->pTransport->pfnNotifyBye( pClient->pTransportClient);806 pThis->pTransport->pfnNotifyBye(&pThis->TransportInst, pClient->pTransportClient); 807 807 papClients[uId - 1] = NULL; 808 808 cClientsCur--; … … 829 829 AssertPtrReturn(pThis, VERR_INVALID_POINTER); 830 830 831 int rc = VINF_SUCCESS; 831 int rc = RTThreadUserSignal(hThread); 832 AssertRCReturn(rc, rc); 832 833 833 834 while (!pThis->fTerminate) … … 838 839 */ 839 840 PATSTRANSPORTCLIENT pTransportClient; 840 rc = pThis->pTransport->pfnWaitForConnect(&pT ransportClient);841 rc = pThis->pTransport->pfnWaitForConnect(&pThis->TransportInst, &pTransportClient); 841 842 if (RT_FAILURE(rc)) 842 843 continue; … … 866 867 { 867 868 RTMsgError("Creating new client structure failed with out of memory error\n"); 868 pThis->pTransport->pfnNotifyBye( pTransportClient);869 pThis->pTransport->pfnNotifyBye(&pThis->TransportInst, pTransportClient); 869 870 } 870 871 } … … 878 879 * @returns VBox status code. 879 880 * @param pThis The ATS instance. 881 * @param pszBindAddr Bind address. Empty means any address. 882 * If set to NULL, "127.0.0.1" will be used. 883 * @param uBindPort Bind port. If set to 0, ATS_DEFAULT_PORT is being used. 880 884 * @param pCallbacks The callbacks table to use. 881 885 * */ 882 int AudioTestSvcInit(PATSSERVER pThis, PCATSCALLBACKS pCallbacks) 886 int AudioTestSvcInit(PATSSERVER pThis, 887 const char *pszBindAddr, uint32_t uBindPort, PCATSCALLBACKS pCallbacks) 883 888 { 884 889 memcpy(&pThis->Callbacks, pCallbacks, sizeof(ATSCALLBACKS)); … … 896 901 * Initialize the transport layer. 897 902 */ 898 int rc = pThis->pTransport->pfnInit(); 903 int rc = pThis->pTransport->pfnInit(&pThis->TransportInst, pszBindAddr ? pszBindAddr : "127.0.0.1", 904 uBindPort ? uBindPort : ATS_TCP_DEFAULT_PORT); 899 905 if (RT_SUCCESS(rc)) 900 906 { … … 950 956 "AUDTSTSRVM"); 951 957 if (RT_SUCCESS(rc)) 952 pThis->fStarted = true; 958 { 959 rc = RTThreadUserWait(pThis->hThreadMain, RT_MS_30SEC); 960 if (RT_SUCCESS(rc)) 961 pThis->fStarted = true; 962 } 953 963 954 964 return rc; … … 969 979 970 980 if (pThis->pTransport) 971 pThis->pTransport->pfnTerm( );981 pThis->pTransport->pfnTerm(&pThis->TransportInst); 972 982 973 983 size_t cbWritten; -
trunk/src/VBox/Devices/Audio/AudioTestService.h
r89458 r89541 26 26 27 27 /** Default TCP/IP port the ATS (Audio Test Service) is running on. */ 28 #define ATS_DEFAULT_PORT 6052 28 #define ATS_TCP_DEFAULT_PORT 6052 29 /** Alternative TCP/IP port the ATS (Audio Test Service) is running on. */ 30 #define ATS_TCP_ALT_PORT 6042 29 31 30 32 /** … … 76 78 77 79 /** 80 * Structure for keeping Audio Test Service (ATS) transport instance-specific data. 81 * 82 * Currently only TCP/IP is supported. 83 */ 84 typedef struct ATSTRANSPORTINST 85 { 86 /** The addresses to bind to. Empty string means any. */ 87 char szTcpBindAddr[256]; 88 /** The TCP port to listen to. */ 89 uint32_t uTcpBindPort; 90 /** Pointer to the TCP server instance. */ 91 PRTTCPSERVER pTcpServer; 92 } ATSTRANSPORTINST; 93 /** Pointer to an Audio Test Service (ATS) TCP/IP transport instance. */ 94 typedef ATSTRANSPORTINST *PATSTRANSPORTINSTTCP; 95 96 /** 78 97 * Structure for keeping an Audio Test Service (ATS) instance. 79 98 */ … … 82 101 /** The selected transport layer. */ 83 102 PCATSTRANSPORT pTransport; 103 /** The transport instance. */ 104 ATSTRANSPORTINST TransportInst; 84 105 /** The callbacks table. */ 85 106 ATSCALLBACKS Callbacks; … … 106 127 typedef ATSSERVER *PATSSERVER; 107 128 108 int AudioTestSvcInit(PATSSERVER pThis, PCATSCALLBACKS pCallbacks);129 int AudioTestSvcInit(PATSSERVER pThis, const char *pszBindAddr, uint32_t uBindPort, PCATSCALLBACKS pCallbacks); 109 130 int AudioTestSvcDestroy(PATSSERVER pThis); 110 131 int AudioTestSvcStart(PATSSERVER pThis); -
trunk/src/VBox/Devices/Audio/AudioTestServiceClient.cpp
r89458 r89541 295 295 296 296 /* For simplicity we always run on the same port, localhost only. */ 297 int rc = RTTcpClientConnect(pszAddr ? pszAddr : "127.0.0.1", uPort == 0 ? ATS_ DEFAULT_PORT : uPort, &pClient->hSock);297 int rc = RTTcpClientConnect(pszAddr ? pszAddr : "127.0.0.1", uPort == 0 ? ATS_TCP_DEFAULT_PORT : uPort, &pClient->hSock); 298 298 if (RT_SUCCESS(rc)) 299 299 { -
trunk/src/VBox/Devices/Audio/AudioTestServiceInternal.h
r89182 r89541 33 33 typedef PATSTRANSPORTCLIENT *PPATSTRANSPORTCLIENT; 34 34 35 /** Opaque ATS transport specific instance data. */ 36 typedef struct ATSTRANSPORTINST *PATSTRANSPORTINST; 37 typedef PATSTRANSPORTINST *PPATSTRANSPORTINST; 38 35 39 /** 36 40 * Transport layer descriptor. … … 42 46 /** The description. */ 43 47 const char *pszDesc; 44 /** Pointer to an array of options. */45 PCRTGETOPTDEF paOpts;46 /** The number of options in the array. */47 size_t cOpts;48 49 /**50 * Print the usage information for this transport layer.51 *52 * @param pStream The stream to print the usage info to.53 *54 * @remarks This is only required if TXSTRANSPORT::cOpts is greater than 0.55 */56 DECLR3CALLBACKMEMBER(void, pfnUsage, (PRTSTREAM pStream));57 58 /**59 * Handle an option.60 *61 * When encountering an options that is not part of the base options, we'll call62 * this method for each transport layer until one handles it.63 *64 * @retval VINF_SUCCESS if handled.65 * @retval VERR_TRY_AGAIN if not handled.66 * @retval VERR_INVALID_PARAMETER if we should exit with a non-zero status.67 *68 * @param ch The short option value.69 * @param pVal Pointer to the value union.70 *71 * @remarks This is only required if TXSTRANSPORT::cOpts is greater than 0.72 */73 DECLR3CALLBACKMEMBER(int, pfnOption, (int ch, PCRTGETOPTUNION pVal));74 48 75 49 /** … … 78 52 * @returns IPRT status code. On errors, the transport layer shall call 79 53 * RTMsgError to display the error details to the user. 54 * @param pThis The transport instance. 55 * @param pszBindAddr Bind address. Empty means any address. 56 * @param uBindPort Bind port. If set to 0, ATS_DEFAULT_PORT is being used. 80 57 */ 81 DECLR3CALLBACKMEMBER(int, pfnInit, ( void));58 DECLR3CALLBACKMEMBER(int, pfnInit, (PATSTRANSPORTINST pThis, const char *pszBindAddr, uint32_t uBindPort)); 82 59 83 60 /** … … 86 63 * On errors, the transport layer shall call RTMsgError to display the error 87 64 * details to the user. 65 * 66 * @param pThis The transport instance. 88 67 */ 89 DECLR3CALLBACKMEMBER(void, pfnTerm, ( void));68 DECLR3CALLBACKMEMBER(void, pfnTerm, (PATSTRANSPORTINST pThis)); 90 69 91 70 /** … … 93 72 * success. 94 73 */ 95 DECLR3CALLBACKMEMBER(int, pfnWaitForConnect, (P PATSTRANSPORTCLIENT ppClientNew));74 DECLR3CALLBACKMEMBER(int, pfnWaitForConnect, (PATSTRANSPORTINST pThis, PPATSTRANSPORTCLIENT ppClientNew)); 96 75 97 76 /** … … 99 78 * 100 79 * @returns true if there are pending packets, false if there isn't. 80 * @param pThis The transport instance. 101 81 * @param pClient The client to poll for data. 102 82 */ 103 DECLR3CALLBACKMEMBER(bool, pfnPollIn, (PATSTRANSPORT CLIENT pClient));83 DECLR3CALLBACKMEMBER(bool, pfnPollIn, (PATSTRANSPORTINST pThis, PATSTRANSPORTCLIENT pClient)); 104 84 105 85 /** … … 107 87 * 108 88 * @returns IPRT status code. 89 * @param pThis The transport instance. 109 90 * @param hPollSet The poll set to add them to. 110 91 * @param pClient The transport client structure. 111 92 * @param idStart The handle ID to start at. 112 93 */ 113 DECLR3CALLBACKMEMBER(int, pfnPollSetAdd, ( RTPOLLSET hPollSet, PATSTRANSPORTCLIENT pClient, uint32_t idStart));94 DECLR3CALLBACKMEMBER(int, pfnPollSetAdd, (PATSTRANSPORTINST pThis, RTPOLLSET hPollSet, PATSTRANSPORTCLIENT pClient, uint32_t idStart)); 114 95 115 96 /** … … 117 98 * 118 99 * @returns IPRT status code. 100 * @param pThis The transport instance. 119 101 * @param hPollSet The poll set to remove from. 120 102 * @param pClient The transport client structure. 121 103 * @param idStart The handle ID to remove. 122 104 */ 123 DECLR3CALLBACKMEMBER(int, pfnPollSetRemove, ( RTPOLLSET hPollSet, PATSTRANSPORTCLIENT pClient, uint32_t idStart));105 DECLR3CALLBACKMEMBER(int, pfnPollSetRemove, (PATSTRANSPORTINST pThis, RTPOLLSET hPollSet, PATSTRANSPORTCLIENT pClient, uint32_t idStart)); 124 106 125 107 /** … … 134 116 * receive call. 135 117 * 118 * @param pThis The transport instance. 136 119 * @param pClient The transport client structure. 137 120 * @param ppPktHdr Where to return the pointer to the packet we've … … 140 123 * free by calling RTMemFree. 141 124 */ 142 DECLR3CALLBACKMEMBER(int, pfnRecvPkt, (PATSTRANSPORT CLIENT pClient, PPATSPKTHDR ppPktHdr));125 DECLR3CALLBACKMEMBER(int, pfnRecvPkt, (PATSTRANSPORTINST pThis, PATSTRANSPORTCLIENT pClient, PPATSPKTHDR ppPktHdr)); 143 126 144 127 /** … … 150 133 * @retval VERR_INTERRUPTED if interrupted before anything was sent. 151 134 * 135 * @param pThis The transport instance. 152 136 * @param pClient The transport client structure. 153 137 * @param pPktHdr The packet to send. The size is given by … … 155 139 * ATSPKT_ALIGNMENT. 156 140 */ 157 DECLR3CALLBACKMEMBER(int, pfnSendPkt, (PATSTRANSPORT CLIENT pClient, PCATSPKTHDR pPktHdr));141 DECLR3CALLBACKMEMBER(int, pfnSendPkt, (PATSTRANSPORTINST pThis, PATSTRANSPORTCLIENT pClient, PCATSPKTHDR pPktHdr)); 158 142 159 143 /** 160 144 * Sends a babble packet and disconnects the client (if applicable). 161 145 * 146 * @param pThis The transport instance. 162 147 * @param pClient The transport client structure. 163 148 * @param pPktHdr The packet to send. The size is given by … … 166 151 * @param cMsSendTimeout The send timeout measured in milliseconds. 167 152 */ 168 DECLR3CALLBACKMEMBER(void, pfnBabble, (PATSTRANSPORT CLIENT pClient, PCATSPKTHDR pPktHdr, RTMSINTERVAL cMsSendTimeout));153 DECLR3CALLBACKMEMBER(void, pfnBabble, (PATSTRANSPORTINST pThis, PATSTRANSPORTCLIENT pClient, PCATSPKTHDR pPktHdr, RTMSINTERVAL cMsSendTimeout)); 169 154 170 155 /** 171 156 * Notification about a client HOWDY. 172 157 * 158 * @param pThis The transport instance. 173 159 * @param pClient The transport client structure. 174 160 */ 175 DECLR3CALLBACKMEMBER(void, pfnNotifyHowdy, (PATSTRANSPORT CLIENT pClient));161 DECLR3CALLBACKMEMBER(void, pfnNotifyHowdy, (PATSTRANSPORTINST pThis, PATSTRANSPORTCLIENT pClient)); 176 162 177 163 /** … … 181 167 * client at this point. 182 168 * 169 * @param pThis The transport instance. 183 170 * @param pClient The transport client structure. 184 171 */ 185 DECLR3CALLBACKMEMBER(void, pfnNotifyBye, (PATSTRANSPORT CLIENT pClient));172 DECLR3CALLBACKMEMBER(void, pfnNotifyBye, (PATSTRANSPORTINST pThis, PATSTRANSPORTCLIENT pClient)); 186 173 187 174 /** … … 190 177 * For connection oriented transport layers, stop listening for and 191 178 * accepting at this point. 179 * 180 * @param pThis The transport instance. 192 181 */ 193 DECLR3CALLBACKMEMBER(void, pfnNotifyReboot, ( void));182 DECLR3CALLBACKMEMBER(void, pfnNotifyReboot, (PATSTRANSPORTINST pThis)); 194 183 195 184 /** Non-zero end marker. */ -
trunk/src/VBox/Devices/Audio/AudioTestServiceTcp.cpp
r89204 r89541 34 34 #include <iprt/time.h> 35 35 36 #include "AudioTestService.h" 36 37 #include "AudioTestServiceInternal.h" 37 38 … … 40 41 * Defined Constants And Macros * 41 42 *********************************************************************************************************************************/ 42 /** The default server port.43 * Note: Do not choose/use 6042, as the Validation Kit TxsService already might use that port. */44 #define ATS_TCP_DEF_BIND_PORT 605245 /** The default server bind address. */46 #define ATS_TCP_DEF_BIND_ADDRESS ""47 43 48 44 … … 70 66 * Global Variables * 71 67 *********************************************************************************************************************************/ 72 /** @name TCP Parameters73 * @{ */74 /** The addresses to bind to. Empty string means any. */75 static char g_szTcpBindAddr[256] = ATS_TCP_DEF_BIND_ADDRESS;76 /** The TCP port to listen to. */77 static uint32_t g_uTcpBindPort = ATS_TCP_DEF_BIND_PORT;78 /** @} */79 80 /** Pointer to the TCP server instance. */81 static PRTTCPSERVER g_pTcpServer = NULL;82 #if 0 /* unused */83 /** Stop connecting attempts when set. */84 static bool g_fTcpStopConnecting = false;85 #endif86 87 88 68 89 69 /** 90 70 * Disconnects the current client and frees all stashed data. 91 71 */ 92 static void atsTcpDisconnectClient(PATSTRANSPORTCLIENT pClient) 93 { 72 static void atsTcpDisconnectClient(PATSTRANSPORTINST pThis, PATSTRANSPORTCLIENT pClient) 73 { 74 RT_NOREF(pThis); 75 94 76 if (pClient->hTcpClient != NIL_RTSOCKET) 95 77 { … … 109 91 * @interface_method_impl{ATSTRANSPORT,pfnWaitForConnect} 110 92 */ 111 static DECLCALLBACK(int) atsTcpWaitForConnect(P PATSTRANSPORTCLIENT ppClientNew)93 static DECLCALLBACK(int) atsTcpWaitForConnect(PATSTRANSPORTINST pThis, PPATSTRANSPORTCLIENT ppClientNew) 112 94 { 113 95 int rc; 114 96 RTSOCKET hClientNew; 115 97 116 rc = RTTcpServerListen2( g_pTcpServer, &hClientNew);98 rc = RTTcpServerListen2(pThis->pTcpServer, &hClientNew); 117 99 Log(("atsTcpWaitForConnect: RTTcpServerListen2 -> %Rrc\n", rc)); 118 100 … … 141 123 * @interface_method_impl{ATSTRANSPORT,pfnNotifyReboot} 142 124 */ 143 static DECLCALLBACK(void) atsTcpNotifyReboot( void)144 { 145 Log(("atsTcpNotifyReboot: RTTcpServerDestroy(%p)\n", g_pTcpServer));146 if ( g_pTcpServer)147 { 148 int rc = RTTcpServerDestroy( g_pTcpServer);125 static DECLCALLBACK(void) atsTcpNotifyReboot(PATSTRANSPORTINST pThis) 126 { 127 Log(("atsTcpNotifyReboot: RTTcpServerDestroy(%p)\n", pThis->pTcpServer)); 128 if (pThis->pTcpServer) 129 { 130 int rc = RTTcpServerDestroy(pThis->pTcpServer); 149 131 if (RT_FAILURE(rc)) 150 132 RTMsgInfo("RTTcpServerDestroy failed in atsTcpNotifyReboot: %Rrc", rc); 151 g_pTcpServer = NULL;133 pThis->pTcpServer = NULL; 152 134 } 153 135 } … … 156 138 * @interface_method_impl{ATSTRANSPORT,pfnNotifyBye} 157 139 */ 158 static DECLCALLBACK(void) atsTcpNotifyBye(PATSTRANSPORT CLIENT pClient)140 static DECLCALLBACK(void) atsTcpNotifyBye(PATSTRANSPORTINST pThis, PATSTRANSPORTCLIENT pClient) 159 141 { 160 142 Log(("atsTcpNotifyBye: atsTcpDisconnectClient %RTsock\n", pClient->hTcpClient)); 161 atsTcpDisconnectClient(p Client);143 atsTcpDisconnectClient(pThis, pClient); 162 144 RTMemFree(pClient); 163 145 } … … 166 148 * @interface_method_impl{ATSTRANSPORT,pfnNotifyHowdy} 167 149 */ 168 static DECLCALLBACK(void) atsTcpNotifyHowdy(PATSTRANSPORT CLIENT pClient)150 static DECLCALLBACK(void) atsTcpNotifyHowdy(PATSTRANSPORTINST pThis, PATSTRANSPORTCLIENT pClient) 169 151 { 170 152 /* nothing to do here */ 171 RT_NOREF 1(pClient);153 RT_NOREF(pThis, pClient); 172 154 } 173 155 … … 175 157 * @interface_method_impl{ATSTRANSPORT,pfnBabble} 176 158 */ 177 static DECLCALLBACK(void) atsTcpBabble(PATSTRANSPORT CLIENT pClient, PCATSPKTHDR pPktHdr, RTMSINTERVAL cMsSendTimeout)159 static DECLCALLBACK(void) atsTcpBabble(PATSTRANSPORTINST pThis, PATSTRANSPORTCLIENT pClient, PCATSPKTHDR pPktHdr, RTMSINTERVAL cMsSendTimeout) 178 160 { 179 161 /* … … 190 172 */ 191 173 Log(("atsTcpBabble: atsTcpDisconnectClient(%RTsock) (RTTcpWrite rc=%Rrc)\n", pClient->hTcpClient, rc)); 192 atsTcpDisconnectClient(p Client);174 atsTcpDisconnectClient(pThis, pClient); 193 175 } 194 176 … … 196 178 * @interface_method_impl{ATSTRANSPORT,pfnSendPkt} 197 179 */ 198 static DECLCALLBACK(int) atsTcpSendPkt(PATSTRANSPORT CLIENT pClient, PCATSPKTHDR pPktHdr)180 static DECLCALLBACK(int) atsTcpSendPkt(PATSTRANSPORTINST pThis, PATSTRANSPORTCLIENT pClient, PCATSPKTHDR pPktHdr) 199 181 { 200 182 Assert(pPktHdr->cb >= sizeof(ATSPKTHDR)); … … 210 192 /* assume fatal connection error. */ 211 193 Log(("RTTcpWrite -> %Rrc -> atsTcpDisconnectClient(%RTsock)\n", rc, pClient->hTcpClient)); 212 atsTcpDisconnectClient(p Client);194 atsTcpDisconnectClient(pThis, pClient); 213 195 } 214 196 … … 219 201 * @interface_method_impl{ATSTRANSPORT,pfnRecvPkt} 220 202 */ 221 static DECLCALLBACK(int) atsTcpRecvPkt(PATSTRANSPORT CLIENT pClient, PPATSPKTHDR ppPktHdr)203 static DECLCALLBACK(int) atsTcpRecvPkt(PATSTRANSPORTINST pThis, PATSTRANSPORTCLIENT pClient, PPATSPKTHDR ppPktHdr) 222 204 { 223 205 int rc = VINF_SUCCESS; … … 335 317 /* assume fatal connection error. */ 336 318 Log(("atsTcpRecvPkt: RTTcpRead -> %Rrc -> atsTcpDisconnectClient(%RTsock)\n", rc, pClient->hTcpClient)); 337 atsTcpDisconnectClient(p Client);319 atsTcpDisconnectClient(pThis, pClient); 338 320 } 339 321 } … … 345 327 * @interface_method_impl{ATSTRANSPORT,pfnPollSetAdd} 346 328 */ 347 static DECLCALLBACK(int) atsTcpPollSetAdd(RTPOLLSET hPollSet, PATSTRANSPORTCLIENT pClient, uint32_t idStart) 348 { 329 static DECLCALLBACK(int) atsTcpPollSetAdd(PATSTRANSPORTINST pThis, RTPOLLSET hPollSet, PATSTRANSPORTCLIENT pClient, uint32_t idStart) 330 { 331 RT_NOREF(pThis); 349 332 return RTPollSetAddSocket(hPollSet, pClient->hTcpClient, RTPOLL_EVT_READ | RTPOLL_EVT_ERROR, idStart); 350 333 } … … 353 336 * @interface_method_impl{ATSTRANSPORT,pfnPollSetRemove} 354 337 */ 355 static DECLCALLBACK(int) atsTcpPollSetRemove( RTPOLLSET hPollSet, PATSTRANSPORTCLIENT pClient, uint32_t idStart)356 { 357 RT_NOREF 1(pClient);338 static DECLCALLBACK(int) atsTcpPollSetRemove(PATSTRANSPORTINST pThis, RTPOLLSET hPollSet, PATSTRANSPORTCLIENT pClient, uint32_t idStart) 339 { 340 RT_NOREF(pThis, pClient); 358 341 return RTPollSetRemove(hPollSet, idStart); 359 342 } … … 362 345 * @interface_method_impl{ATSTRANSPORT,pfnPollIn} 363 346 */ 364 static DECLCALLBACK(bool) atsTcpPollIn(PATSTRANSPORTCLIENT pClient) 365 { 347 static DECLCALLBACK(bool) atsTcpPollIn(PATSTRANSPORTINST pThis, PATSTRANSPORTCLIENT pClient) 348 { 349 RT_NOREF(pThis); 366 350 int rc = RTTcpSelectOne(pClient->hTcpClient, 0/*cMillies*/); 367 351 return RT_SUCCESS(rc); … … 371 355 * @interface_method_impl{ATSTRANSPORT,pfnTerm} 372 356 */ 373 static DECLCALLBACK(void) atsTcpTerm( void)357 static DECLCALLBACK(void) atsTcpTerm(PATSTRANSPORTINST pThis) 374 358 { 375 359 /* Shut down the server (will wake up thread). */ 376 if ( g_pTcpServer)360 if (pThis->pTcpServer) 377 361 { 378 362 Log(("atsTcpTerm: Destroying server...\n")); 379 int rc = RTTcpServerDestroy( g_pTcpServer);363 int rc = RTTcpServerDestroy(pThis->pTcpServer); 380 364 if (RT_FAILURE(rc)) 381 365 RTMsgInfo("RTTcpServerDestroy failed in atsTcpTerm: %Rrc", rc); 382 g_pTcpServer = NULL;366 pThis->pTcpServer = NULL; 383 367 } 384 368 … … 389 373 * @interface_method_impl{ATSTRANSPORT,pfnInit} 390 374 */ 391 static DECLCALLBACK(int) atsTcpInit( void)392 { 393 int rc = RTTcpServerCreateEx( g_szTcpBindAddr[0] ? g_szTcpBindAddr : NULL, g_uTcpBindPort, &g_pTcpServer);375 static DECLCALLBACK(int) atsTcpInit(PATSTRANSPORTINST pThis, const char *pszBindAddr, uint32_t uBindPort) 376 { 377 int rc = RTTcpServerCreateEx(pszBindAddr[0] ? pszBindAddr : NULL, uBindPort, &pThis->pTcpServer); 394 378 if (RT_FAILURE(rc)) 395 379 { … … 397 381 { 398 382 RTMsgInfo("RTTcpServerCreateEx(%s, %u,) failed: %Rrc, retrying for 20 seconds...\n", 399 g_szTcpBindAddr[0] ? g_szTcpBindAddr : NULL, g_uTcpBindPort, rc);383 pszBindAddr[0] ? pszBindAddr : NULL, uBindPort, rc); 400 384 uint64_t StartMs = RTTimeMilliTS(); 401 385 do 402 386 { 403 387 RTThreadSleep(1000); 404 rc = RTTcpServerCreateEx( g_szTcpBindAddr[0] ? g_szTcpBindAddr : NULL, g_uTcpBindPort, &g_pTcpServer);388 rc = RTTcpServerCreateEx(pszBindAddr[0] ? pszBindAddr : NULL, uBindPort, &pThis->pTcpServer); 405 389 } while ( rc == VERR_NET_DOWN 406 390 && RTTimeMilliTS() - StartMs < 20000); … … 410 394 if (RT_FAILURE(rc)) 411 395 { 412 g_pTcpServer = NULL;396 pThis->pTcpServer = NULL; 413 397 RTMsgError("RTTcpServerCreateEx(%s, %u,) failed: %Rrc\n", 414 g_szTcpBindAddr[0] ? g_szTcpBindAddr : NULL, g_uTcpBindPort, rc);398 pszBindAddr[0] ? pszBindAddr : NULL, uBindPort, rc); 415 399 } 416 400 } … … 418 402 return rc; 419 403 } 420 421 /** Options */422 enum ATSTCPOPT423 {424 ATSTCPOPT_BIND_ADDRESS = 1000,425 ATSTCPOPT_BIND_PORT426 };427 428 /**429 * @interface_method_impl{ATSTRANSPORT,pfnOption}430 */431 static DECLCALLBACK(int) atsTcpOption(int ch, PCRTGETOPTUNION pVal)432 {433 int rc;434 435 switch (ch)436 {437 case ATSTCPOPT_BIND_ADDRESS:438 rc = RTStrCopy(g_szTcpBindAddr, sizeof(g_szTcpBindAddr), pVal->psz);439 if (RT_FAILURE(rc))440 return RTMsgErrorRc(VERR_INVALID_PARAMETER, "TCP bind address is too long (%Rrc)", rc);441 return VINF_SUCCESS;442 443 case ATSTCPOPT_BIND_PORT:444 g_uTcpBindPort = pVal->u16 == 0 ? ATS_TCP_DEF_BIND_PORT : pVal->u16;445 return VINF_SUCCESS;446 }447 return VERR_TRY_AGAIN;448 }449 450 /**451 * @interface_method_impl{ATSTRANSPORT,pfnUsage}452 */453 DECLCALLBACK(void) atsTcpUsage(PRTSTREAM pStream)454 {455 RTStrmPrintf(pStream,456 " --tcp-bind-address <address>\n"457 " The address(es) to listen to TCP connection on. Empty string\n"458 " means any address, this is the default.\n"459 " --tcp-bind-port <port>\n"460 " The port to listen to TCP connections on.\n"461 " Default: %u\n"462 , ATS_TCP_DEF_BIND_PORT);463 }464 465 /** Command line options for the TCP/IP transport layer. */466 static const RTGETOPTDEF g_TcpOpts[] =467 {468 { "--tcp-bind-address", ATSTCPOPT_BIND_ADDRESS, RTGETOPT_REQ_STRING },469 { "--tcp-bind-port", ATSTCPOPT_BIND_PORT, RTGETOPT_REQ_UINT16 }470 };471 404 472 405 /** TCP/IP transport layer. */ … … 475 408 /* .szName = */ "tcp", 476 409 /* .pszDesc = */ "TCP/IP", 477 /* .cOpts = */ &g_TcpOpts[0],478 /* .paOpts = */ RT_ELEMENTS(g_TcpOpts),479 /* .pfnUsage = */ atsTcpUsage,480 /* .pfnOption = */ atsTcpOption,481 410 /* .pfnInit = */ atsTcpInit, 482 411 /* .pfnTerm = */ atsTcpTerm, … … 493 422 /* .u32EndMarker = */ UINT32_C(0x12345678) 494 423 }; 424 -
trunk/src/VBox/Devices/Audio/DrvHostAudioValidationKit.cpp
r89510 r89541 155 155 pTst->pObj = NULL; 156 156 157 AssertPtrReturnVoid(pTst->pEntry); 158 AudioTestSetTestDone(pTst->pEntry); 159 pTst->pEntry = NULL; 157 if (pTst->pEntry) /* Set set entry assign? Mark as done. */ 158 { 159 AssertPtrReturnVoid(pTst->pEntry); 160 AudioTestSetTestDone(pTst->pEntry); 161 pTst->pEntry = NULL; 162 } 160 163 161 164 RTMemFree(pTst); … … 235 238 /** @copydoc ATSCALLBACKS::pfnTonePlay 236 239 * 237 * Creates and registers a new test tone recording test 238 * which later then gets recorded by the guest side. 240 * Creates and registers a new test tone guest recording test. 239 241 */ 240 242 static DECLCALLBACK(int) drvHostValKitRegisterGuestRecTest(void const *pvUser, PAUDIOTESTTONEPARMS pToneParms) … … 270 272 /** @copydoc ATSCALLBACKS::pfnToneRecord 271 273 * 272 * Creates and registers a new test tone playback test 273 * which later then records audio played back by the guest side. 274 * Creates and registers a new test tone guest playback test. 274 275 */ 275 276 static DECLCALLBACK(int) drvHostValKitRegisterGuestPlayTest(void const *pvUser, PAUDIOTESTTONEPARMS pToneParms) … … 283 284 284 285 pTestData->t.TestTone.u.Rec.cbToWrite = PDMAudioPropsMilliToBytes(&pToneParms->Props, 285 pTestData->t.TestTone.Parms.msDuration);286 pTestData->t.TestTone.Parms.msDuration); 286 287 int rc = RTCritSectEnter(&pThis->CritSect); 287 288 if (RT_SUCCESS(rc)) … … 714 715 Callbacks.pvUser = pThis; 715 716 716 LogRel(("Audio: Validation Kit: Starting Audio Test Service (ATS) ...\n")); 717 718 int rc = AudioTestSvcInit(&pThis->Srv, &Callbacks); 717 /** @todo Make this configurable via CFGM. */ 718 const char *pszTcpAddr = "127.0.0.1"; 719 uint32_t uTcpPort = ATS_TCP_DEFAULT_PORT; 720 721 LogRel(("Audio: Validation Kit: Starting Audio Test Service (ATS) at %s:%RU32...\n", 722 pszTcpAddr, uTcpPort)); 723 724 int rc = AudioTestSvcInit(&pThis->Srv, 725 /* We only allow connections from localhost for now. */ 726 pszTcpAddr, uTcpPort, &Callbacks); 719 727 if (RT_SUCCESS(rc)) 720 728 rc = AudioTestSvcStart(&pThis->Srv); -
trunk/src/VBox/ValidationKit/utils/audio/vkat.cpp
r89525 r89541 182 182 /** Audio testing mode. */ 183 183 AUDIOTESTMODE enmMode; 184 /** Whether self test mode is active or not. */ 185 bool fSelftest; 184 186 /** Output path for storing the test environment's final test files. */ 185 187 char szTag[AUDIOTEST_TAG_MAX]; … … 211 213 struct 212 214 { 213 ATSCLIENT Client; 215 /** Client connected to the ATS on the guest side. */ 216 ATSCLIENT AtsClGuest; 217 /** Client connected to the ATS on the Validation Kit. */ 218 ATSCLIENT AtsClValKit; 214 219 } Host; 215 220 } u; … … 303 308 enum 304 309 { 305 VKAT_SELFTEST_OPT_ATS_HOST = 900 310 VKAT_SELFTEST_OPT_ATS_GUEST_ADDR = 900, 311 VKAT_SELFTEST_OPT_ATS_GUEST_PORT, 312 VKAT_SELFTEST_OPT_ATS_VALKIT_ADDR, 313 VKAT_SELFTEST_OPT_ATS_VALKIT_PORT 306 314 }; 307 315 … … 493 501 RTThreadSleep(pTstEnv->cMsSchedulingHint); 494 502 495 RTTestPrintf(g_hTest, RTTESTLVL_DEBUG, "Written %RU32 bytes\n", cbWritten);496 497 503 Assert(cbToWrite >= cbWritten); 498 504 cbToWrite -= cbWritten; … … 564 570 RTThreadSleep(pTstEnv->cMsSchedulingHint); 565 571 566 RTTestPrintf(g_hTest, RTTESTLVL_DEBUG, "Read %RU32 bytes\n", cbRead);567 568 572 Assert(cbToRead >= cbRead); 569 573 cbToRead -= cbRead; … … 595 599 PAUDIOTESTENV pTstEnv = pCtx->pTstEnv; 596 600 597 RTTestPrintf(g_hTest, RTTESTLVL_DEBUG, "Beginning test set '%s'\n", pszTag); 598 599 return AudioTestSetCreate(&pTstEnv->Set, pTstEnv->szPathTemp, pszTag); 601 char szTag[AUDIOTEST_TAG_MAX]; 602 int rc = RTStrPrintf2(szTag, sizeof(szTag), "%s-guest", pszTag); 603 AssertRCReturn(rc, rc); 604 605 RTTestPrintf(g_hTest, RTTESTLVL_DEBUG, "Beginning test set '%s'\n", szTag); 606 607 return AudioTestSetCreate(&pTstEnv->Set, pTstEnv->szPathTemp, szTag); 600 608 } 601 609 … … 708 716 * @param pDrvReg Audio driver to use. 709 717 * @param fWithDrvAudio Whether to include DrvAudio in the stack or not. 710 * @param pszTag Tag name to use. If NULL, a generated UUID will be used.711 718 * @param pszTcpAddr TCP/IP address to connect to. 719 * If NULL, localhost (127.0.0.1) will be used. 712 720 * @param uTcpPort TCP/IP port to connect to. 721 * If 0, ATS_DEFAULT_PORT will be used. 713 722 */ 714 723 static int audioTestEnvInit(PAUDIOTESTENV pTstEnv, 715 PCPDMDRVREG pDrvReg, bool fWithDrvAudio, const char *pszTag,724 PCPDMDRVREG pDrvReg, bool fWithDrvAudio, 716 725 const char *pszTcpAddr, uint32_t uTcpPort) 717 726 { 718 727 RTTestPrintf(g_hTest, RTTESTLVL_ALWAYS, "Test mode is '%s'\n", pTstEnv->enmMode == AUDIOTESTMODE_HOST ? "host" : "guest"); 719 RTTestPrintf(g_hTest, RTTESTLVL_ALWAYS, "Using tag '%s'\n", p szTag);728 RTTestPrintf(g_hTest, RTTESTLVL_ALWAYS, "Using tag '%s'\n", pTstEnv->szTag); 720 729 RTTestPrintf(g_hTest, RTTESTLVL_ALWAYS, "Output directory is '%s'\n", pTstEnv->szPathOut); 721 730 RTTestPrintf(g_hTest, RTTESTLVL_ALWAYS, "Temp directory is '%s'\n", pTstEnv->szPathTemp); … … 730 739 731 740 /* Only the guest mode needs initializing the driver stack. */ 732 const bool fUseDriverStack = pTstEnv->enmMode == AUDIOTESTMODE_GUEST; 741 const bool fUseDriverStack = pTstEnv->enmMode == AUDIOTESTMODE_GUEST 742 /* The self test mode drives the ValKit audio driver locally, 743 * so also use the driver stack here. */ 744 || pTstEnv->fSelftest; 733 745 if (fUseDriverStack) 734 746 { … … 772 784 Callbacks.pvUser = &Ctx; 773 785 774 RTTestPrintf(g_hTest, RTTESTLVL_DEBUG, "Starting ATS ...\n");775 rc = AudioTestSvcInit(&pTstEnv->u.Guest.Srv, &Callbacks);786 RTTestPrintf(g_hTest, RTTESTLVL_DEBUG, "Starting guest ATS at %s:%RU32...\n", pszTcpAddr, uTcpPort); 787 rc = AudioTestSvcInit(&pTstEnv->u.Guest.Srv, pszTcpAddr, uTcpPort, &Callbacks); 776 788 if (RT_SUCCESS(rc)) 777 789 rc = AudioTestSvcStart(&pTstEnv->u.Guest.Srv); … … 785 797 else /* Host mode */ 786 798 { 787 RTTestPrintf(g_hTest, RTTESTLVL_DEBUG, "Connecting to ATS at %s:%RU32 ...\n", pszTcpAddr, uTcpPort); 788 789 rc = AudioTestSvcClientConnect(&pTstEnv->u.Host.Client, pszTcpAddr, uTcpPort); 799 RTTestPrintf(g_hTest, RTTESTLVL_DEBUG, "Connecting to guest ATS at %s:%RU32 ...\n", 800 (pszTcpAddr && *pszTcpAddr) ? pszTcpAddr : "127.0.0.1", uTcpPort ? uTcpPort : ATS_TCP_DEFAULT_PORT); 801 802 rc = AudioTestSvcClientConnect(&pTstEnv->u.Host.AtsClGuest, pszTcpAddr, uTcpPort); 790 803 if (RT_FAILURE(rc)) 791 804 { … … 850 863 AudioTestSetDestroy(&pTstEnv->Set); 851 864 865 if (RT_FAILURE(rc)) 866 RTTestFailed(g_hTest, "Test set prologue failed with %Rrc\n", rc); 867 852 868 return rc; 853 869 } … … 892 908 static int audioTestDevicesEnumerateAndCheck(PAUDIOTESTENV pTstEnv, const char *pszDev, PPDMAUDIOHOSTDEV *ppDev) 893 909 { 910 #ifdef DEBUG_andy 911 return VINF_SUCCESS; 912 #endif 913 894 914 RTTestSubF(g_hTest, "Enumerating audio devices and checking for device '%s'", pszDev ? pszDev : "<Default>"); 895 915 … … 1107 1127 Cfg.Props = pTstParms->Props; 1108 1128 1109 rc = AudioTestSvcClientTonePlay(&pTstEnv->u.Host. Client, &pTstParms->TestTone);1129 rc = AudioTestSvcClientTonePlay(&pTstEnv->u.Host.AtsClGuest, &pTstParms->TestTone); 1110 1130 if (RT_SUCCESS(rc)) 1111 1131 { … … 1138 1158 static DECLCALLBACK(int) audioTestRecordToneSetup(PAUDIOTESTENV pTstEnv, PAUDIOTESTDESC pTstDesc, PAUDIOTESTPARMS pTstParmsAcq, void **ppvCtx) 1139 1159 { 1140 RT_NOREF(pTst Env, pTstDesc, ppvCtx);1160 RT_NOREF(pTstDesc, ppvCtx); 1141 1161 1142 1162 pTstParmsAcq->enmType = AUDIOTESTTYPE_TESTTONE_RECORD; … … 1152 1172 pTstParmsAcq->idxCurrent = 0; 1153 1173 1154 return VINF_SUCCESS; 1174 /* Connect to the Validation Kit audio driver ATS. */ 1175 int rc = AudioTestSvcClientConnect(&pTstEnv->u.Host.AtsClValKit, 1176 "127.0.0.1" /** @todo Make this dynamic. */, ATS_TCP_DEFAULT_PORT); 1177 if (RT_SUCCESS(rc)) 1178 { 1179 char szTag[AUDIOTEST_TAG_MAX]; 1180 rc = RTStrPrintf2(szTag, sizeof(szTag), "%s-valkit", pTstEnv->szTag); 1181 if (RT_SUCCESS(rc)) 1182 rc = AudioTestSvcClientTestSetBegin(&pTstEnv->u.Host.AtsClValKit, szTag); 1183 } 1184 1185 return rc; 1155 1186 } 1156 1187 … … 1167 1198 { 1168 1199 pTstParms->TestTone.Props = pTstParms->Props; 1169 pTstParms->TestTone.msDuration = RTRandU32Ex(50 /* ms */, RT_MS_10SEC); /** @todo Record even longer? */ 1170 1200 #ifdef DEBUG_andy 1201 pTstParms->TestTone.msDuration = RTRandU32Ex(50 /* ms */, 2000); 1202 #else 1203 pTstParms->TestTone.msDuration = RTRandU32Ex(50 /* ms */, RT_MS_30SEC); /** @todo Record even longer? */ 1204 #endif 1171 1205 PAUDIOTESTENTRY pTst; 1172 1206 rc = AudioTestSetTestBegin(&pTstEnv->Set, "Recording test tone", pTstParms, &pTst); 1173 1207 if (RT_SUCCESS(rc)) 1174 1208 { 1175 rc = AudioTestSvcClientToneRecord(&pTstEnv->u.Host.Client, &pTstParms->TestTone); 1209 /* 1210 * 1. Arm the ValKit ATS with the recording parameters. 1211 */ 1212 rc = AudioTestSvcClientTonePlay(&pTstEnv->u.Host.AtsClValKit, &pTstParms->TestTone); 1176 1213 if (RT_SUCCESS(rc)) 1177 1214 { 1178 AudioTestSetTestDone(pTst); 1215 /* 1216 * 2. Tell the guest ATS to start recording. 1217 */ 1218 rc = AudioTestSvcClientToneRecord(&pTstEnv->u.Host.AtsClGuest, &pTstParms->TestTone); 1219 if (RT_SUCCESS(rc)) 1220 { 1221 AudioTestSetTestDone(pTst); 1222 } 1223 else 1224 AudioTestSetTestFailed(pTst, rc, "Recording test tone failed"); 1179 1225 } 1180 else1181 AudioTestSetTestFailed(pTst, rc, "Recording test tone failed");1182 1226 } 1183 1227 … … 1194 1238 static DECLCALLBACK(int) audioTestRecordToneDestroy(PAUDIOTESTENV pTstEnv, void *pvCtx) 1195 1239 { 1196 RT_NOREF(pTstEnv, pvCtx); 1197 1198 return VINF_SUCCESS; 1240 RT_NOREF(pvCtx); 1241 1242 char szTag[AUDIOTEST_TAG_MAX]; 1243 int rc = RTStrPrintf2(szTag, sizeof(szTag), "%s-valkit", pTstEnv->szTag); 1244 if (RT_SUCCESS(rc)) 1245 rc = AudioTestSvcClientTestSetEnd(&pTstEnv->u.Host.AtsClValKit, szTag); 1246 1247 int rc2 = AudioTestSvcClientClose(&pTstEnv->u.Host.AtsClValKit); 1248 if (RT_SUCCESS(rc)) 1249 rc = rc2; 1250 1251 return rc; 1199 1252 } 1200 1253 … … 1245 1298 if (RT_FAILURE(rc)) 1246 1299 { 1247 RTTestFailed(g_hTest, "Test setup failed \n");1300 RTTestFailed(g_hTest, "Test setup failed with %Rrc\n", rc); 1248 1301 return rc; 1249 1302 } … … 1259 1312 AssertPtr(pTstDesc->pfnExec); 1260 1313 rc = pTstDesc->pfnExec(pTstEnv, pvCtx, &TstParms); 1314 if (RT_FAILURE(rc)) 1315 RTTestFailed(g_hTest, "Test failed with %Rrc\n", rc); 1261 1316 1262 1317 RTTestSubDone(g_hTest); … … 1269 1324 1270 1325 if (RT_FAILURE(rc2)) 1271 RTTestFailed(g_hTest, "Test destruction failed \n");1326 RTTestFailed(g_hTest, "Test destruction failed with %Rrc\n", rc2); 1272 1327 } 1273 1328 … … 1292 1347 if (pTstEnv->enmMode == AUDIOTESTMODE_GUEST) 1293 1348 { 1294 RTTestPrintf(g_hTest, RTTESTLVL_ALWAYS, "ATS running\n"); 1295 1296 while (!g_fTerminate) /** @todo Implement signal handling. */ 1297 { 1349 RTTestPrintf(g_hTest, RTTESTLVL_ALWAYS, "Guest ATS running\n"); 1350 1351 while (!g_fTerminate) 1298 1352 RTThreadSleep(100); 1299 } 1300 1301 RTTestPrintf(g_hTest, RTTESTLVL_DEBUG, "Shutting down ATS ...\n"); 1353 1354 RTTestPrintf(g_hTest, RTTESTLVL_ALWAYS, "Shutting down guest ATS ...\n"); 1302 1355 1303 1356 int rc2 = AudioTestSvcShutdown(&pTstEnv->u.Guest.Srv); 1304 1357 if (RT_SUCCESS(rc)) 1305 1358 rc = rc2; 1359 1360 RTTestPrintf(g_hTest, RTTESTLVL_ALWAYS, "Guest ATS shutdown complete\n"); 1306 1361 } 1307 1362 else if (pTstEnv->enmMode == AUDIOTESTMODE_HOST) 1308 1363 { 1364 /* Generate tag for the host side. */ 1365 char szTag[AUDIOTEST_TAG_MAX]; 1366 rc = RTStrPrintf2(szTag, sizeof(szTag), "%s-host", pTstEnv->szTag); 1367 AssertRCReturn(rc, rc); 1368 1309 1369 /* We have one single test set for all executed tests for now. */ 1310 rc = AudioTestSetCreate(&pTstEnv->Set, pTstEnv->szPathTemp, pTstEnv->szTag);1370 rc = AudioTestSetCreate(&pTstEnv->Set, pTstEnv->szPathTemp, szTag); 1311 1371 if (RT_SUCCESS(rc)) 1312 1372 { 1313 /* Copy back the (eventually generated) tag to the test environment. */ 1314 rc = RTStrCopy(pTstEnv->szTag, sizeof(pTstEnv->szTag), AudioTestSetGetTag(&pTstEnv->Set)); 1315 AssertRC(rc); 1316 1317 rc = AudioTestSvcClientTestSetBegin(&pTstEnv->u.Host.Client, pTstEnv->szTag); 1373 rc = AudioTestSvcClientTestSetBegin(&pTstEnv->u.Host.AtsClGuest, pTstEnv->szTag); 1318 1374 if (RT_SUCCESS(rc)) 1319 1375 { … … 1327 1383 if (!g_aTests[i].fExcluded) 1328 1384 uSeq++; 1385 1386 if (g_fTerminate) 1387 break; 1329 1388 } 1330 1389 1331 int rc2 = AudioTestSvcClientTestSetEnd(&pTstEnv->u.Host. Client, pTstEnv->szTag);1390 int rc2 = AudioTestSvcClientTestSetEnd(&pTstEnv->u.Host.AtsClGuest, pTstEnv->szTag); 1332 1391 if (RT_SUCCESS(rc)) 1333 1392 rc = rc2; … … 1509 1568 /* Use the default port is none is specified. */ 1510 1569 if (!uTcpPort) 1511 uTcpPort = ATS_ DEFAULT_PORT;1570 uTcpPort = ATS_TCP_DEFAULT_PORT; 1512 1571 1513 1572 if (!pszTcpAddr) … … 1516 1575 1517 1576 /* For now all tests have the same test environment. */ 1518 rc = audioTestEnvInit(&TstEnv, pDrvReg, fWithDrvAudio, pszT ag, pszTcpAddr, uTcpPort);1577 rc = audioTestEnvInit(&TstEnv, pDrvReg, fWithDrvAudio, pszTcpAddr, uTcpPort); 1519 1578 if (RT_SUCCESS(rc)) 1520 1579 { … … 1526 1585 1527 1586 if (RT_FAILURE(rc)) /* Let us know that something went wrong in case we forgot to mention it. */ 1528 RTTestFailed(g_hTest, "Test edfailed with %Rrc\n", rc);1587 RTTestFailed(g_hTest, "Testing failed with %Rrc\n", rc); 1529 1588 1530 1589 /* … … 2481 2540 *********************************************************************************************************************************/ 2482 2541 2542 /** @todo Move this (all?) commands into separate files -- this file is too big already. */ 2543 2483 2544 /** 2484 2545 * Command line parameters for self-test mode. … … 2486 2547 static const RTGETOPTDEF g_aCmdSelftestOptions[] = 2487 2548 { 2488 { "--ats-host", VKAT_SELFTEST_OPT_ATS_HOST, RTGETOPT_REQ_STRING }, 2489 { "--backend", 'b', RTGETOPT_REQ_STRING }, 2490 { "--with-drv-audio", 'd', RTGETOPT_REQ_NOTHING }, 2549 { "--ats-guest-addr", VKAT_SELFTEST_OPT_ATS_GUEST_ADDR, RTGETOPT_REQ_STRING }, 2550 { "--ats-guest-port", VKAT_SELFTEST_OPT_ATS_GUEST_PORT, RTGETOPT_REQ_UINT32 }, 2551 { "--ats-valkit-addr", VKAT_SELFTEST_OPT_ATS_GUEST_ADDR, RTGETOPT_REQ_STRING }, 2552 { "--ats-valkit-port", VKAT_SELFTEST_OPT_ATS_GUEST_PORT, RTGETOPT_REQ_UINT32 }, 2553 { "--exclude-all", 'a', RTGETOPT_REQ_NOTHING }, 2554 { "--backend", 'b', RTGETOPT_REQ_STRING }, 2555 { "--with-drv-audio", 'd', RTGETOPT_REQ_NOTHING }, 2556 { "--exclude", 'e', RTGETOPT_REQ_UINT32 }, 2557 { "--include", 'i', RTGETOPT_REQ_UINT32 } 2491 2558 }; 2492 2559 … … 2503 2570 2504 2571 /** 2505 * Tests the Audio Test Service (ATS). 2572 * Structure for keeping a VKAT self test context. 2573 */ 2574 typedef struct SELFTESTCTX 2575 { 2576 /** Common tag for guest and host side. */ 2577 char szTag[AUDIOTEST_TAG_MAX]; 2578 /** Whether to use DrvAudio in the driver stack or not. */ 2579 bool fWithDrvAudio; 2580 struct 2581 { 2582 AUDIOTESTENV TstEnv; 2583 /** Audio driver to use. 2584 * Defaults to the platform's default driver. */ 2585 PCPDMDRVREG pDrvReg; 2586 } Guest; 2587 struct 2588 { 2589 AUDIOTESTENV TstEnv; 2590 /** Address of the guest ATS instance. 2591 * Defaults to localhost (127.0.0.1) if not set. */ 2592 char szGuestAtsAddr[64]; 2593 /** Port of the guest ATS instance. 2594 * Defaults to ATS_DEFAULT_PORT if not set. */ 2595 uint32_t uGuestAtsPort; 2596 /** Address of the Validation Kit audio driver ATS instance. 2597 * Defaults to localhost (127.0.0.1) if not set. */ 2598 char szValKitAtsAddr[64]; 2599 /** Port of the Validation Kit audio driver ATS instance. 2600 * Defaults to ATS_ALT_PORT if not set. */ 2601 uint32_t uValKitAtsPort; 2602 } Host; 2603 } SELFTESTCTX; 2604 /** Pointer to a VKAT self test context. */ 2605 typedef SELFTESTCTX *PSELFTESTCTX; 2606 2607 static DECLCALLBACK(int) audioTestSelftestGuestAtsThread(RTTHREAD hThread, void *pvUser) 2608 { 2609 RT_NOREF(hThread); 2610 PSELFTESTCTX pCtx = (PSELFTESTCTX)pvUser; 2611 2612 AUDIOTESTPARMS TstCust; 2613 audioTestParmsInit(&TstCust); 2614 2615 PAUDIOTESTENV pTstEnv = &pCtx->Guest.TstEnv; 2616 2617 /* Flag the environment for self test mode. */ 2618 pTstEnv->fSelftest = true; 2619 2620 /* Generate tag for guest side. */ 2621 int rc = RTStrCopy(pTstEnv->szTag, sizeof(pTstEnv->szTag), pCtx->szTag); 2622 AssertRCReturn(rc, rc); 2623 2624 rc = AudioTestPathCreateTemp(pTstEnv->szPathTemp, sizeof(pTstEnv->szPathTemp), "selftest-guest"); 2625 AssertRCReturn(rc, rc); 2626 2627 rc = AudioTestPathCreateTemp(pTstEnv->szPathOut, sizeof(pTstEnv->szPathOut), "selftest-out"); 2628 AssertRCReturn(rc, rc); 2629 2630 pTstEnv->enmMode = AUDIOTESTMODE_GUEST; 2631 2632 /** @todo Make this customizable. */ 2633 PDMAudioPropsInit(&TstCust.TestTone.Props, 2634 2 /* 16-bit */, true /* fSigned */, 2 /* cChannels */, 44100 /* uHz */); 2635 2636 /* Use ATS_ALT_PORT, as on ATS_DEFAULT_PORT the 2637 * Validation Kit audio driver ATS already is running on ATS_DEFAULT_PORT. */ 2638 rc = audioTestEnvInit(pTstEnv, pCtx->Guest.pDrvReg, pCtx->fWithDrvAudio, 2639 "127.0.0.1", ATS_TCP_ALT_PORT); 2640 if (RT_SUCCESS(rc)) 2641 { 2642 RTThreadUserSignal(hThread); 2643 2644 audioTestWorker(pTstEnv, &TstCust); 2645 audioTestEnvDestroy(pTstEnv); 2646 } 2647 2648 audioTestParmsDestroy(&TstCust); 2649 2650 return rc; 2651 } 2652 2653 /** 2654 * Main function for performing the self test. 2506 2655 * 2507 2656 * @returns VBox status code. 2508 * @param pDrvReg Backend driver to use. 2509 * @param pszAdr Address of ATS server to connect to. 2510 * If NULL, an own (local) ATS server will be created. 2511 */ 2512 static int audioTestDoSelftestAts(PCPDMDRVREG pDrvReg, const char *pszAdr) 2513 { 2514 AUDIOTESTENV TstEnv; 2515 int rc = audioTestDriverStackInit(&TstEnv.DrvStack, pDrvReg, true /* fWithDrvAudio */); 2657 * @param pCtx Self test context to use. 2658 */ 2659 static int audioTestDoSelftest(PSELFTESTCTX pCtx) 2660 { 2661 RTTestPrintf(g_hTest, RTTESTLVL_ALWAYS, "Running self test ...\n"); 2662 2663 /* 2664 * The self-test does the following: 2665 * - 1. Creates an ATS instance to emulate the guest mode ("--mode guest") 2666 * at port 6042 (ATS_ALT_PORT). 2667 * - 2. Uses the Validation Kit audio backend, which in turn creates an ATS instance 2668 * at port 6052 (ATS_DEFAULT_PORT). 2669 * - 3. Executes a complete test run locally (e.g. without any guest (VM) involved). 2670 */ 2671 2672 AUDIOTESTPARMS TstCust; 2673 audioTestParmsInit(&TstCust); 2674 2675 /* Generate a common tag for guest and host side. */ 2676 int rc = AudioTestGenTag(pCtx->szTag, sizeof(pCtx->szTag)); 2677 AssertRCReturn(rc, rc); 2678 2679 PAUDIOTESTENV pTstEnv = &pCtx->Host.TstEnv; 2680 2681 /* Flag the environment for self test mode. */ 2682 pTstEnv->fSelftest = true; 2683 2684 /* Generate tag for host side. */ 2685 rc = RTStrCopy(pTstEnv->szTag, sizeof(pTstEnv->szTag), pCtx->szTag); 2686 AssertRCReturn(rc, rc); 2687 2688 rc = AudioTestPathCreateTemp(pTstEnv->szPathTemp, sizeof(pTstEnv->szPathTemp), "selftest-host"); 2689 AssertRCReturn(rc, rc); 2690 2691 rc = AudioTestPathCreateTemp(pTstEnv->szPathOut, sizeof(pTstEnv->szPathOut), "selftest-out"); 2692 AssertRCReturn(rc, rc); 2693 2694 /* 2695 * Step 1. 2696 * Creates a separate thread for the guest ATS. 2697 */ 2698 RTTHREAD hThreadGstAts; 2699 rc = RTThreadCreate(&hThreadGstAts, audioTestSelftestGuestAtsThread, pCtx, 0, RTTHREADTYPE_IO, RTTHREADFLAGS_WAITABLE, 2700 "VKATGstAts"); 2516 2701 if (RT_SUCCESS(rc)) 2517 2702 { 2518 /** @todo Make stream parameters configurable. */ 2519 PDMAUDIOPCMPROPS Props; 2520 PDMAudioPropsInit(&Props, 16 /* bit */ / 8, true /* fSigned */, 2 /* Channels */, 44100 /* Hz */); 2521 2522 PDMAUDIOSTREAMCFG CfgAcq; 2523 PPDMAUDIOSTREAM pStream = NULL; 2524 rc = audioTestDriverStackStreamCreateOutput(&TstEnv.DrvStack, &Props, 2525 UINT32_MAX /* cMsBufferSize */, 2526 UINT32_MAX /* cMsPreBuffer */, 2527 UINT32_MAX /* cMsSchedulingHint */, &pStream, &CfgAcq); 2703 rc = RTThreadUserWait(hThreadGstAts, RT_MS_30SEC); 2528 2704 if (RT_SUCCESS(rc)) 2529 2705 { 2530 rc = audioTestDriverStackStreamEnable(&TstEnv.DrvStack, pStream); 2706 /* 2707 * Steps 2 + 3. 2708 */ 2709 pTstEnv->enmMode = AUDIOTESTMODE_HOST; 2710 2711 if (!pCtx->Host.uGuestAtsPort) 2712 pCtx->Host.uGuestAtsPort = ATS_TCP_ALT_PORT; 2713 2714 rc = audioTestEnvInit(pTstEnv, &g_DrvHostValidationKitAudio, true /* fWithDrvAudio */, 2715 pCtx->Host.szGuestAtsAddr, pCtx->Host.uGuestAtsPort); 2531 2716 if (RT_SUCCESS(rc)) 2532 2717 { 2533 ATSCALLBACKCTX Ctx; 2534 Ctx.pTstEnv = &TstEnv; 2535 2536 ATSCALLBACKS Callbacks; 2537 Callbacks.pfnTonePlay = audioTestSvcTonePlayCallback; 2538 Callbacks.pvUser = &Ctx; 2539 2540 /* Start an own ATS instance if no address to connect was specified. */ 2541 ATSSERVER Srv; 2542 if (pszAdr == NULL) 2543 { 2544 RTTestPrintf(g_hTest, RTTESTLVL_ALWAYS, "Starting ATS ...\n"); 2545 2546 rc = AudioTestSvcInit(&Srv, &Callbacks); 2547 if (RT_SUCCESS(rc)) 2548 rc = AudioTestSvcStart(&Srv); 2549 } 2550 else 2551 RTTestPrintf(g_hTest, RTTESTLVL_ALWAYS, "Connecting to ATS at '%s' ...\n", pszAdr); 2552 2553 if (RT_SUCCESS(rc)) 2554 { 2555 ATSCLIENT Conn; 2556 rc = AudioTestSvcClientConnect(&Conn, NULL, 0); 2557 if (RT_SUCCESS(rc)) 2558 { 2559 RTTestPrintf(g_hTest, RTTESTLVL_ALWAYS, "Connected to ATS, testing ...\n"); 2560 2561 /* Do the bare minimum here to get a test tone out. */ 2562 AUDIOTESTTONEPARMS ToneParms; 2563 RT_ZERO(ToneParms); 2564 ToneParms.msDuration = RTRandU32Ex(250, 1000 * 5); 2565 memcpy(&ToneParms.Props, &CfgAcq.Props, sizeof(PDMAUDIOPCMPROPS)); 2566 2567 rc = AudioTestSvcClientTonePlay(&Conn, &ToneParms); 2568 2569 int rc2 = AudioTestSvcClientClose(&Conn); 2570 if (RT_SUCCESS(rc)) 2571 rc = rc2; 2572 } 2573 else 2574 RTTestFailed(g_hTest, "Connecting to ATS failed, rc=%Rrc\n", rc); 2575 2576 int rc2 = AudioTestSvcShutdown(&Srv); 2577 if (RT_SUCCESS(rc)) 2578 rc = rc2; 2579 } 2580 2581 if (pszAdr == NULL) 2582 { 2583 RTTestPrintf(g_hTest, RTTESTLVL_ALWAYS, "Shutting down ATS ...\n"); 2584 2585 int rc2 = AudioTestSvcDestroy(&Srv); 2586 if (RT_SUCCESS(rc)) 2587 rc = rc2; 2588 } 2718 audioTestWorker(pTstEnv, &TstCust); 2719 audioTestEnvDestroy(pTstEnv); 2589 2720 } 2590 2721 } 2591 2722 } 2592 2723 2724 audioTestParmsDestroy(&TstCust); 2725 2726 /* 2727 * Shutting down. 2728 */ 2729 RTTestPrintf(g_hTest, RTTESTLVL_ALWAYS, "Shutting down self test\n"); 2730 2731 ASMAtomicWriteBool(&g_fTerminate, true); 2732 2733 int rcThread; 2734 int rc2 = RTThreadWait(hThreadGstAts, RT_MS_30SEC, &rcThread); 2735 if (RT_SUCCESS(rc2)) 2736 rc2 = rcThread; 2737 if (RT_FAILURE(rc2)) 2738 RTTestFailed(g_hTest, "Shutting down self test failed with %Rrc\n", rc2); 2739 2740 if (RT_SUCCESS(rc)) 2741 rc = rc2; 2742 2593 2743 if (RT_FAILURE(rc)) 2594 RTTestFailed(g_hTest, "Testing ATS failed with %Rrc\n", rc); 2595 2596 return rc; 2597 } 2598 2599 /** 2600 * Main function for performing the self-tests. 2601 * 2602 * @returns VBox status code. 2603 * @param pDrvReg Backend driver to use. 2604 * @param pszAtsAdr Address of ATS server to connect to. 2605 * If NULL, an own (local) ATS server will be created. 2606 */ 2607 static int audioTestDoSelftest(PCPDMDRVREG pDrvReg, const char *pszAtsAdr) 2608 { 2609 int rc = audioTestDoSelftestAts(pDrvReg, pszAtsAdr); 2610 if (RT_FAILURE(rc)) 2611 RTTestFailed(g_hTest, "Self-test failed with: %Rrc", rc); 2744 RTTestFailed(g_hTest, "Self test failed with %Rrc\n", rc); 2612 2745 2613 2746 return rc; … … 2622 2755 static DECLCALLBACK(RTEXITCODE) audioTestCmdSelftestHandler(PRTGETOPTSTATE pGetState) 2623 2756 { 2624 /* Option values: */ 2625 PCPDMDRVREG pDrvReg = g_aBackends[0].pDrvReg; 2626 bool fWithDrvAudio = false; 2627 const char *pszAtsAddr = NULL; 2757 SELFTESTCTX Ctx; 2758 RT_ZERO(Ctx); 2759 2760 /* Go with the platform's default bakcend if nothing else is specified. */ 2761 Ctx.Guest.pDrvReg = g_aBackends[0].pDrvReg; 2628 2762 2629 2763 /* Argument processing loop: */ … … 2634 2768 switch (rc) 2635 2769 { 2636 case VKAT_SELFTEST_OPT_ATS_HOST: 2637 pszAtsAddr = ValueUnion.psz; 2770 case VKAT_SELFTEST_OPT_ATS_GUEST_ADDR: 2771 rc = RTStrCopy(Ctx.Host.szGuestAtsAddr, sizeof(Ctx.Host.szGuestAtsAddr), ValueUnion.psz); 2772 break; 2773 2774 case VKAT_SELFTEST_OPT_ATS_GUEST_PORT: 2775 Ctx.Host.uGuestAtsPort = ValueUnion.u32; 2776 break; 2777 2778 case VKAT_SELFTEST_OPT_ATS_VALKIT_ADDR: 2779 rc = RTStrCopy(Ctx.Host.szValKitAtsAddr, sizeof(Ctx.Host.szValKitAtsAddr), ValueUnion.psz); 2780 break; 2781 2782 case VKAT_SELFTEST_OPT_ATS_VALKIT_PORT: 2783 Ctx.Host.uValKitAtsPort = ValueUnion.u32; 2784 break; 2785 2786 case 'a': 2787 for (unsigned i = 0; i < RT_ELEMENTS(g_aTests); i++) 2788 g_aTests[i].fExcluded = true; 2638 2789 break; 2639 2790 2640 2791 case 'b': 2641 pDrvReg = audioTestFindBackendOpt(ValueUnion.psz); 2642 if (pDrvReg == NULL) 2792 { 2793 Ctx.Guest.pDrvReg = audioTestFindBackendOpt(ValueUnion.psz); 2794 if (Ctx.Guest.pDrvReg == NULL) 2643 2795 return RTEXITCODE_SYNTAX; 2644 2796 break; 2797 } 2645 2798 2646 2799 case 'd': 2647 fWithDrvAudio = true; 2800 Ctx.fWithDrvAudio = true; 2801 break; 2802 2803 case 'e': 2804 if (ValueUnion.u32 >= RT_ELEMENTS(g_aTests)) 2805 return RTMsgErrorExit(RTEXITCODE_SYNTAX, "Invalid test number %u passed to --exclude", ValueUnion.u32); 2806 g_aTests[ValueUnion.u32].fExcluded = true; 2807 break; 2808 2809 case 'i': 2810 if (ValueUnion.u32 >= RT_ELEMENTS(g_aTests)) 2811 return RTMsgErrorExit(RTEXITCODE_SYNTAX, "Invalid test number %u passed to --include", ValueUnion.u32); 2812 g_aTests[ValueUnion.u32].fExcluded = false; 2648 2813 break; 2649 2814 … … 2655 2820 } 2656 2821 2657 audioTestDoSelftest(pDrvReg, pszAtsAddr); 2822 /* 2823 * Start testing. 2824 */ 2825 RTTestBanner(g_hTest); 2826 2827 int rc2 = audioTestDoSelftest(&Ctx); 2828 if (RT_FAILURE(rc2)) 2829 RTTestFailed(g_hTest, "Self test failed with rc=%Rrc", rc2); 2658 2830 2659 2831 /*
Note:
See TracChangeset
for help on using the changeset viewer.