annotate src/portaudio_20140130/test/patest_jack_wasapi.c @ 124:e3d5853d5918

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