annotate src/portaudio_20161030/test/patest_jack_wasapi.c @ 140:59a8758c56b1

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