annotate src/portaudio_20161030_catalina_patch/test/patest_jack_wasapi.c @ 83:ae30d91d2ffe

Replace these with versions built using an older toolset (so as to avoid ABI compatibilities when linking on Ubuntu 14.04 for packaging purposes)
author Chris Cannam
date Fri, 07 Feb 2020 11:51:13 +0000
parents 4edcd14160a5
children
rev   line source
Chris@55 1 /** @file pa_test_jack_wasapi.c
Chris@55 2 @ingroup test_src
Chris@55 3 @brief Print out jack information for WASAPI endpoints
Chris@55 4 @author Reid Bishop <rbish@attglobal.net>
Chris@55 5 */
Chris@55 6 /*
Chris@55 7 * $Id: pa_test_jack_wasapi.c 1368 2008-03-01 00:38:27Z rbishop $
Chris@55 8 *
Chris@55 9 * This program uses the PortAudio Portable Audio Library.
Chris@55 10 * For more information see: http://www.portaudio.com/
Chris@55 11 * Copyright (c) 1999-2010 Ross Bencina and Phil Burk
Chris@55 12 *
Chris@55 13 * Permission is hereby granted, free of charge, to any person obtaining
Chris@55 14 * a copy of this software and associated documentation files
Chris@55 15 * (the "Software"), to deal in the Software without restriction,
Chris@55 16 * including without limitation the rights to use, copy, modify, merge,
Chris@55 17 * publish, distribute, sublicense, and/or sell copies of the Software,
Chris@55 18 * and to permit persons to whom the Software is furnished to do so,
Chris@55 19 * subject to the following conditions:
Chris@55 20 *
Chris@55 21 * The above copyright notice and this permission notice shall be
Chris@55 22 * included in all copies or substantial portions of the Software.
Chris@55 23 *
Chris@55 24 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
Chris@55 25 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
Chris@55 26 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
Chris@55 27 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR
Chris@55 28 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
Chris@55 29 * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
Chris@55 30 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Chris@55 31 */
Chris@55 32
Chris@55 33 /*
Chris@55 34 * The text above constitutes the entire PortAudio license; however,
Chris@55 35 * the PortAudio community also makes the following non-binding requests:
Chris@55 36 *
Chris@55 37 * Any person wishing to distribute modifications to the Software is
Chris@55 38 * requested to send the modifications to the original developer so that
Chris@55 39 * they can be incorporated into the canonical version. It is also
Chris@55 40 * requested that these non-binding requests be included along with the
Chris@55 41 * license above.
Chris@55 42 */
Chris@55 43 #include <stdio.h>
Chris@55 44 #include "portaudio.h"
Chris@55 45 #include "pa_win_wasapi.h"
Chris@55 46
Chris@55 47
Chris@55 48 /*
Chris@55 49 * Helper function to determine if a given enum is present in mask variable
Chris@55 50 *
Chris@55 51 */
Chris@55 52 static int IsInMask(int val, int val2)
Chris@55 53 {
Chris@55 54 return ((val & val2) == val2);
Chris@55 55 }
Chris@55 56
Chris@55 57 /*
Chris@55 58 * This routine enumerates through the ChannelMapping for the IJackDescription
Chris@55 59 */
Chris@55 60
Chris@55 61 static void EnumIJackChannels(int channelMapping)
Chris@55 62 {
Chris@55 63 printf("Channel Mapping: ");
Chris@55 64 if(channelMapping == PAWIN_SPEAKER_DIRECTOUT)
Chris@55 65 {
Chris@55 66 printf("DIRECTOUT\n");
Chris@55 67 return;
Chris@55 68 }
Chris@55 69 if(IsInMask(channelMapping, PAWIN_SPEAKER_FRONT_LEFT))
Chris@55 70 printf("FRONT_LEFT, ");
Chris@55 71 if(IsInMask(channelMapping, PAWIN_SPEAKER_FRONT_RIGHT))
Chris@55 72 printf("FRONT_RIGHT, ");
Chris@55 73 if(IsInMask(channelMapping, PAWIN_SPEAKER_FRONT_CENTER))
Chris@55 74 printf("FRONT_CENTER, ");
Chris@55 75 if(IsInMask(channelMapping, PAWIN_SPEAKER_LOW_FREQUENCY))
Chris@55 76 printf("LOW_FREQUENCY, ");
Chris@55 77 if(IsInMask(channelMapping, PAWIN_SPEAKER_BACK_LEFT))
Chris@55 78 printf("BACK_LEFT, ");
Chris@55 79 if(IsInMask(channelMapping,PAWIN_SPEAKER_BACK_RIGHT))
Chris@55 80 printf("BACK_RIGHT, ");
Chris@55 81 if(IsInMask(channelMapping, PAWIN_SPEAKER_FRONT_LEFT_OF_CENTER))
Chris@55 82 printf("FRONT_LEFT_OF_CENTER, ");
Chris@55 83 if(IsInMask(channelMapping, PAWIN_SPEAKER_FRONT_RIGHT_OF_CENTER))
Chris@55 84 printf("FRONT_RIGHT_OF_CENTER, ");
Chris@55 85 if(IsInMask(channelMapping, PAWIN_SPEAKER_BACK_CENTER))
Chris@55 86 printf("BACK_CENTER, ");
Chris@55 87 if(IsInMask(channelMapping,PAWIN_SPEAKER_SIDE_LEFT))
Chris@55 88 printf("SIDE_LEFT, ");
Chris@55 89 if(IsInMask(channelMapping,PAWIN_SPEAKER_SIDE_RIGHT))
Chris@55 90 printf("SIDE_RIGHT, ");
Chris@55 91 if(IsInMask(channelMapping, PAWIN_SPEAKER_TOP_CENTER))
Chris@55 92 printf("TOP_CENTER, ");
Chris@55 93 if(IsInMask(channelMapping, PAWIN_SPEAKER_TOP_FRONT_LEFT))
Chris@55 94 printf("TOP_FRONT_LEFT, ");
Chris@55 95 if(IsInMask(channelMapping, PAWIN_SPEAKER_TOP_FRONT_CENTER))
Chris@55 96 printf("TOP_FRONT_CENTER, ");
Chris@55 97 if(IsInMask(channelMapping, PAWIN_SPEAKER_TOP_FRONT_RIGHT))
Chris@55 98 printf("TOP_FRONT_RIGHT, ");
Chris@55 99 if(IsInMask(channelMapping, PAWIN_SPEAKER_TOP_BACK_LEFT))
Chris@55 100 printf("TOP_BACK_LEFT, ");
Chris@55 101 if(IsInMask(channelMapping, PAWIN_SPEAKER_TOP_BACK_CENTER))
Chris@55 102 printf("TOP_BACK_CENTER, ");
Chris@55 103 if(IsInMask(channelMapping, PAWIN_SPEAKER_TOP_BACK_RIGHT))
Chris@55 104 printf("TOP_BACK_RIGHT, ");
Chris@55 105
Chris@55 106 printf("\n");
Chris@55 107 }
Chris@55 108
Chris@55 109 /*
Chris@55 110 * This routine enumerates through the Jack Connection Types enums for IJackDescription
Chris@55 111 */
Chris@55 112 static void EnumIJackConnectionType(int cType)
Chris@55 113 {
Chris@55 114 printf("Connection Type: ");
Chris@55 115 switch(cType)
Chris@55 116 {
Chris@55 117 case eJackConnTypeUnknown:
Chris@55 118 printf("eJackConnTypeUnknown");
Chris@55 119 break;
Chris@55 120 case eJackConnType3Point5mm:
Chris@55 121 printf("eJackConnType3Point5mm");
Chris@55 122 break;
Chris@55 123 case eJackConnTypeQuarter:
Chris@55 124 printf("eJackConnTypeQuarter");
Chris@55 125 break;
Chris@55 126 case eJackConnTypeAtapiInternal:
Chris@55 127 printf("eJackConnTypeAtapiInternal");
Chris@55 128 break;
Chris@55 129 case eJackConnTypeRCA:
Chris@55 130 printf("eJackConnTypeRCA");
Chris@55 131 break;
Chris@55 132 case eJackConnTypeOptical:
Chris@55 133 printf("eJackConnTypeOptical");
Chris@55 134 break;
Chris@55 135 case eJackConnTypeOtherDigital:
Chris@55 136 printf("eJackConnTypeOtherDigital");
Chris@55 137 break;
Chris@55 138 case eJackConnTypeOtherAnalog:
Chris@55 139 printf("eJackConnTypeOtherAnalog");
Chris@55 140 break;
Chris@55 141 case eJackConnTypeMultichannelAnalogDIN:
Chris@55 142 printf("eJackConnTypeMultichannelAnalogDIN");
Chris@55 143 break;
Chris@55 144 case eJackConnTypeXlrProfessional:
Chris@55 145 printf("eJackConnTypeXlrProfessional");
Chris@55 146 break;
Chris@55 147 case eJackConnTypeRJ11Modem:
Chris@55 148 printf("eJackConnTypeRJ11Modem");
Chris@55 149 break;
Chris@55 150 case eJackConnTypeCombination:
Chris@55 151 printf("eJackConnTypeCombination");
Chris@55 152 break;
Chris@55 153 }
Chris@55 154 printf("\n");
Chris@55 155 }
Chris@55 156
Chris@55 157 /*
Chris@55 158 * This routine enumerates through the GeoLocation enums for the IJackDescription
Chris@55 159 */
Chris@55 160 static void EnumIJackGeoLocation(int iVal)
Chris@55 161 {
Chris@55 162 printf("Geometric Location: ");
Chris@55 163 switch(iVal)
Chris@55 164 {
Chris@55 165 case eJackGeoLocRear:
Chris@55 166 printf("eJackGeoLocRear");
Chris@55 167 break;
Chris@55 168 case eJackGeoLocFront:
Chris@55 169 printf("eJackGeoLocFront");
Chris@55 170 break;
Chris@55 171 case eJackGeoLocLeft:
Chris@55 172 printf("eJackGeoLocLeft");
Chris@55 173 break;
Chris@55 174 case eJackGeoLocRight:
Chris@55 175 printf("eJackGeoLocRight");
Chris@55 176 break;
Chris@55 177 case eJackGeoLocTop:
Chris@55 178 printf("eJackGeoLocTop");
Chris@55 179 break;
Chris@55 180 case eJackGeoLocBottom:
Chris@55 181 printf("eJackGeoLocBottom");
Chris@55 182 break;
Chris@55 183 case eJackGeoLocRearPanel:
Chris@55 184 printf("eJackGeoLocRearPanel");
Chris@55 185 break;
Chris@55 186 case eJackGeoLocRiser:
Chris@55 187 printf("eJackGeoLocRiser");
Chris@55 188 break;
Chris@55 189 case eJackGeoLocInsideMobileLid:
Chris@55 190 printf("eJackGeoLocInsideMobileLid");
Chris@55 191 break;
Chris@55 192 case eJackGeoLocDrivebay:
Chris@55 193 printf("eJackGeoLocDrivebay");
Chris@55 194 break;
Chris@55 195 case eJackGeoLocHDMI:
Chris@55 196 printf("eJackGeoLocHDMI");
Chris@55 197 break;
Chris@55 198 case eJackGeoLocOutsideMobileLid:
Chris@55 199 printf("eJackGeoLocOutsideMobileLid");
Chris@55 200 break;
Chris@55 201 case eJackGeoLocATAPI:
Chris@55 202 printf("eJackGeoLocATAPI");
Chris@55 203 break;
Chris@55 204 }
Chris@55 205 printf("\n");
Chris@55 206 }
Chris@55 207
Chris@55 208 /*
Chris@55 209 * This routine enumerates through the GenLocation enums for the IJackDescription
Chris@55 210 */
Chris@55 211 static void EnumIJackGenLocation(int iVal)
Chris@55 212 {
Chris@55 213 printf("General Location: ");
Chris@55 214 switch(iVal)
Chris@55 215 {
Chris@55 216 case eJackGenLocPrimaryBox:
Chris@55 217 printf("eJackGenLocPrimaryBox");
Chris@55 218 break;
Chris@55 219 case eJackGenLocInternal:
Chris@55 220 printf("eJackGenLocInternal");
Chris@55 221 break;
Chris@55 222 case eJackGenLocSeparate:
Chris@55 223 printf("eJackGenLocSeparate");
Chris@55 224 break;
Chris@55 225 case eJackGenLocOther:
Chris@55 226 printf("eJackGenLocOther");
Chris@55 227 break;
Chris@55 228 }
Chris@55 229 printf("\n");
Chris@55 230 }
Chris@55 231
Chris@55 232 /*
Chris@55 233 * This routine enumerates through the PortConnection enums for the IJackDescription
Chris@55 234 */
Chris@55 235 static void EnumIJackPortConnection(int iVal)
Chris@55 236 {
Chris@55 237 printf("Port Type: ");
Chris@55 238 switch(iVal)
Chris@55 239 {
Chris@55 240 case eJackPortConnJack:
Chris@55 241 printf("eJackPortConnJack");
Chris@55 242 break;
Chris@55 243 case eJackPortConnIntegratedDevice:
Chris@55 244 printf("eJackPortConnIntegratedDevice");
Chris@55 245 break;
Chris@55 246 case eJackPortConnBothIntegratedAndJack:
Chris@55 247 printf("eJackPortConnBothIntegratedAndJack");
Chris@55 248 break;
Chris@55 249 case eJackPortConnUnknown:
Chris@55 250 printf("eJackPortConnUnknown");
Chris@55 251 break;
Chris@55 252 }
Chris@55 253 printf("\n");
Chris@55 254 }
Chris@55 255
Chris@55 256 /*
Chris@55 257 * This routine retrieves and parses the KSJACK_DESCRIPTION structure for
Chris@55 258 * the provided device ID.
Chris@55 259 */
Chris@55 260 static PaError GetJackInformation(int deviceId)
Chris@55 261 {
Chris@55 262 PaError err;
Chris@55 263 int i;
Chris@55 264 int jackCount = 0;
Chris@55 265 PaWasapiJackDescription jackDesc;
Chris@55 266
Chris@55 267 err = PaWasapi_GetJackCount(deviceId, &jackCount);
Chris@55 268 if( err != paNoError ) return err;
Chris@55 269
Chris@55 270 fprintf( stderr,"Number of Jacks: %d \n", jackCount );
Chris@55 271
Chris@55 272 for( i = 0; i<jackCount; i++ )
Chris@55 273 {
Chris@55 274 fprintf( stderr,"Jack #%d:\n", i );
Chris@55 275
Chris@55 276 err = PaWasapi_GetJackDescription(deviceId, i, &jackDesc);
Chris@55 277 if( err != paNoError )
Chris@55 278 {
Chris@55 279 fprintf( stderr,"Failed getting description." );
Chris@55 280 continue;
Chris@55 281 }
Chris@55 282 else
Chris@55 283 {
Chris@55 284 printf("Is connected: %s\n",(jackDesc.isConnected)?"true":"false");
Chris@55 285 EnumIJackChannels(jackDesc.channelMapping);
Chris@55 286 EnumIJackConnectionType(jackDesc.connectionType);
Chris@55 287 EnumIJackGeoLocation(jackDesc.geoLocation);
Chris@55 288 EnumIJackGenLocation(jackDesc.genLocation);
Chris@55 289 EnumIJackPortConnection(jackDesc.portConnection);
Chris@55 290 printf("Jack Color: 0x%06X\n", jackDesc.color);
Chris@55 291 printf("\n");
Chris@55 292 }
Chris@55 293 }
Chris@55 294 return 0;
Chris@55 295 }
Chris@55 296
Chris@55 297
Chris@55 298 /*******************************************************************/
Chris@55 299 int main(void);
Chris@55 300 int main(void)
Chris@55 301 {
Chris@55 302 PaError err;
Chris@55 303 const PaDeviceInfo *device;
Chris@55 304 int i;
Chris@55 305 int jackCount = 0;
Chris@55 306 int isInput = 0;
Chris@55 307
Chris@55 308 printf("PortAudio Test: WASAPI Jack Configuratin");
Chris@55 309 err = Pa_Initialize();
Chris@55 310 if( err != paNoError ) goto error;
Chris@55 311
Chris@55 312 /* Find all WASAPI devices */
Chris@55 313 for( i = 0; i < Pa_GetDeviceCount(); ++i )
Chris@55 314 {
Chris@55 315 device = Pa_GetDeviceInfo(i);
Chris@55 316 if( Pa_GetDeviceInfo(i)->hostApi == Pa_HostApiTypeIdToHostApiIndex(paWASAPI) )
Chris@55 317 {
Chris@55 318 if( device->maxOutputChannels == 0 )
Chris@55 319 {
Chris@55 320 isInput = 1;
Chris@55 321 }
Chris@55 322 printf("------------------------------------------\n");
Chris@55 323 printf("Device: %s",device->name);
Chris@55 324 if(isInput)
Chris@55 325 printf(" (Input) %d Channels\n",device->maxInputChannels);
Chris@55 326 else
Chris@55 327 printf(" (Output) %d Channels\n",device->maxOutputChannels);
Chris@55 328 // Try to see if this WASAPI device can provide Jack information
Chris@55 329 err = GetJackInformation(i);
Chris@55 330 if( err != paNoError ) goto error;
Chris@55 331 }
Chris@55 332 }
Chris@55 333 Pa_Terminate();
Chris@55 334 printf("Test finished.\n");
Chris@55 335 return err;
Chris@55 336
Chris@55 337 error:
Chris@55 338 Pa_Terminate();
Chris@55 339 fprintf( stderr, "An error occured while using the portaudio stream\n" );
Chris@55 340 fprintf( stderr, "Error number: %d\n", err );
Chris@55 341 fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) );
Chris@55 342 return err;
Chris@55 343 }