annotate src/portaudio/test/patest_jack_wasapi.c @ 89:8a15ff55d9af

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