Audio-Play-MPG123
view release on metacpan or search on metacpan
mpg123/audio_nas.c view on Meta::CPAN
format = AuFormatULAW8;
break;
}
/* look for an output device */
for (i = 0; i < AuServerNumDevices(info.aud); i++)
if (((AuDeviceKind(AuServerDevice(info.aud, i)) ==
AuComponentKindPhysicalOutput) &&
AuDeviceNumTracks(AuServerDevice(info.aud, i))
== ai->channels )) {
device = AuDeviceIdentifier(AuServerDevice(info.aud, i));
break;
}
if (device == AuNone) {
fprintf(stderr,
"Couldn't find an output device providing %d channels\n",
ai->channels);
exit(1);
}
/* set gain */
if(ai->gain >= 0) {
info.da = AuGetDeviceAttributes(info.aud, device, NULL);
if ((info.da)!=NULL) {
AuDeviceGain(info.da) = AuFixedPointFromSum(ai->gain, 0);
AuSetDeviceAttributes(info.aud, AuDeviceIdentifier(info.da),
AuCompDeviceGainMask, info.da, NULL);
}
else
fprintf(stderr,"audio/gain: setable Volume/PCM-Level not supported");
}
if (!(info.flow = AuCreateFlow(info.aud, NULL))) {
fprintf(stderr, "Couldn't create flow\n");
exit(1);
}
buf_samples = ai->rate * NAS_SOUND_PORT_DURATION;
AuMakeElementImportClient(&elements[0], /* element */
(unsigned short) ai->rate,
/* rate */
format, /* format */
ai->channels, /* channels */
AuTrue, /* ??? */
buf_samples, /* max samples */
(AuUint32) (buf_samples / 100
* NAS_SOUND_LOW_WATER_MARK),
/* low water mark */
0, /* num actions */
NULL); /* actions */
AuMakeElementExportDevice(&elements[1], /* element */
0, /* input */
device, /* device */
(unsigned short) ai->rate,
/* rate */
AuUnlimitedSamples, /* num samples */
0, /* num actions */
NULL); /* actions */
AuSetElements(info.aud, /* Au server */
info.flow, /* flow ID */
AuTrue, /* clocked */
2, /* num elements */
elements, /* elements */
NULL); /* return status */
AuRegisterEventHandler(info.aud, /* Au server */
AuEventHandlerIDMask, /* value mask */
0, /* type */
info.flow, /* id */
nas_eventHandler, /* callback */
(AuPointer) &info); /* data */
info.buf_size = buf_samples * ai->channels * AuSizeofFormat(format);
info.buf = (char *) malloc(info.buf_size);
if (info.buf == NULL) {
fprintf(stderr, "Unable to allocate input/output buffer of size %ld\n",
info.buf_size);
exit(1);
}
info.buf_cnt = 0;
info.data_sent = AuFalse;
info.finished = AuFalse;
AuStartFlow(info.aud, /* Au server */
info.flow, /* id */
NULL); /* status */
}
void nas_flush()
{
AuEvent ev;
while ((!info.data_sent) && (!info.finished)) {
AuNextEvent(info.aud, AuTrue, &ev);
AuDispatchEvent(info.aud, &ev);
}
info.data_sent = AuFalse;
}
/* required functions */
int audio_open(struct audio_info_struct *ai)
{
if(!ai)
return -1;
if (!(info.aud = AuOpenServer(ai->device, 0, NULL, 0, NULL, NULL))) {
if (ai->device==NULL)
fprintf(stderr,"could not open default NAS server\n");
else
fprintf(stderr,"could not open NAS server %s\n",
ai->device);
exit(1);
}
info.buf_size = 0;
return 0;
}
int audio_reset_parameters(struct audio_info_struct *ai)
( run in 1.685 second using v1.01-cache-2.11-cpan-800906f7e73 )