PcmDevice * openPcmDevice (int errorLevel, const char *device) { #ifdef HAVE_HPUX_AUDIO PcmDevice *pcm; if ((pcm = malloc(sizeof(*pcm)))) { long status; AudioAttrMask mask = 0; AudioAttributes attributes; SSPlayParams parameters; if (!audioServer) { char *server = ""; audioServer = AOpenAudio(server, &status); if (status != AENoError) { logAudioError(errorLevel, status, "AOpenAudio"); audioServer = NULL; goto noServer; } logMessage(LOG_DEBUG, "connected to audio server: %s", AAudioString(audioServer)); ASetCloseDownMode(audioServer, AKeepTransactions, &status); if (status != AENoError) { logAudioError(errorLevel, status, "ASetCloseDownMode"); } } memset(&attributes, 0, sizeof(attributes)); parameters.gain_matrix = *ASimplePlayer(audioServer); parameters.play_volume = AUnityGain; parameters.priority = APriorityUrgent; parameters.event_mask = 0; pcm->transaction = APlaySStream(audioServer, mask, &attributes, ¶meters, &pcm->stream, &status); if (status == AENoError) { if ((pcm->socket = socket(AF_INET, SOCK_STREAM, 0)) != -1) { if (connect(pcm->socket, (struct sockaddr *)&pcm->stream.tcp_sockaddr, sizeof(pcm->stream.tcp_sockaddr)) != -1) { return pcm; } else { logSystemError("PCM socket connection"); } close(pcm->socket); } else { logSystemError("PCM socket creation"); } } else { logAudioError(errorLevel, status, "APlaySStream"); } noServer: free(pcm); } else { logSystemError("PCM device allocation"); } #endif /* HAVE_HPUX_AUDIO */ return NULL; }
/* return on error leaves stuff dirty here... */ static int open_alib(audio_output_t *ao) { AudioAttributes Attribs; AudioAttrMask AttribsMask; AGainEntry gainEntry[4]; SSPlayParams playParams; SStream audioStream; AErrorHandler prevHandler; char server[1]; int i; long status; if (audioServer) { error("openAudio: audio already open"); return -1; } prevHandler = ASetErrorHandler(myHandler); server[0] = '\0'; audioServer = AOpenAudio( server, NULL ); if (audioServer==NULL) { error("Error: could not open audio\n"); return -1; } ao->fn = socket( AF_INET, SOCK_STREAM, 0 ); if(ao->fn<0) { error("Socket creation failed"); return -1; } Attribs.type = ATSampled; Attribs.attr.sampled_attr.sampling_rate = ao->rate; Attribs.attr.sampled_attr.channels = ao->channels; Attribs.attr.sampled_attr.data_format = ADFLin16; AttribsMask = ASSamplingRateMask | ASChannelsMask | ASDataFormatMask; gainEntry[0].gain = AUnityGain; gainEntry[0].u.o.out_ch = AOCTMono; gainEntry[0].u.o.out_dst = AODTDefaultOutput; playParams.gain_matrix.type = AGMTOutput; /* gain matrix */ playParams.gain_matrix.num_entries = 1; playParams.gain_matrix.gain_entries = gainEntry; playParams.play_volume = AUnityGain; /* play volume */ playParams.priority = APriorityNormal; /* normal priority */ playParams.event_mask = 0; /* don't solicit any events */ xid=APlaySStream(audioServer,AttribsMask,&Attribs, &playParams,&audioStream,NULL); status=connect(ao->fn, (struct sockaddr *) &audioStream.tcp_sockaddr, sizeof(struct sockaddr_in) ); if (status<0) { error("Connect failed"); return -1; } i=-1; tcpProtocolEntry=getprotobyname("tcp"); setsockopt(ao->fn,tcpProtocolEntry->p_proto,TCP_NODELAY,&i,sizeof(i)); return ao->fn; }