annotate src/portaudio_20161030_catalina_patch/test/patest_jack_wasapi.c @ 169:223a55898ab9 tip default

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