static AuBool nas_error_handler(AuServer* aud, AuErrorEvent* ev) { char s[100]; AuGetErrorText(aud, ev->error_code, s, 100); NAS_CRITICAL("error [%s]\n" "error_code: %d\n" "request_code: %d\n" "minor_code: %d\n", s, ev->error_code, ev->request_code, ev->minor_code); LONGJMP(nas_server_sig, 1); return AuTrue; }
/* Process audio events from the NAS server. The same routine is used whether we are recording or playing back */ static void handleAudioEvents(int fd, void *data, int flags) { if(!server) { DPRINTF( "handleAudioEvents called while unconnected!\n"); return; } /* read events once */ AuEventsQueued(server, AuEventsQueuedAfterReading); /* then loop through the read queue */ while(AuEventsQueued(server, AuEventsQueuedAlready)) { AuEvent event; AuNextEvent(server, AuTrue, &event); DPRINTF("event of type %d\n", event.type); switch(event.type) { case 0: { AuErrorEvent *errEvent = (AuErrorEvent *) &event; char errdesc[1000]; AuGetErrorText(server, errEvent->error_code, errdesc, sizeof(errdesc)); fprintf(stderr, "audio error: %s\n", errdesc); sound_Stop(); return; /* return, not break, so that we don't process the now-closed server any longer! */ } case AuEventTypeElementNotify: { AuElementNotifyEvent *enEvent = (AuElementNotifyEvent *)&event; switch(enEvent->kind) { case AuElementNotifyKindLowWater: DPRINTF("low water event\n"); bytesAvail += enEvent->num_bytes; break; case AuElementNotifyKindHighWater: DPRINTF("high water event\n"); bytesAvail += enEvent->num_bytes; break; case AuElementNotifyKindState: DPRINTF("state change (%d->%d)\n", enEvent->prev_state, enEvent->cur_state); bytesAvail += enEvent->num_bytes; if(enEvent->cur_state == AuStatePause) { /* if the flow has stopped, then arrange for it to get started again */ /* XXX there is probably a more intelligent place to do this, in case there is a real reason it has paused */ DPRINTF("unpausing\n"); AuStartFlow(server, flow, NULL); AuFlush(server); } break; } } } } if(bytesAvail > 0) { DPRINTF("bytesAvail: %d\n", bytesAvail); signalSemaphoreWithIndex(semaIndex); } aioHandle(fd, handleAudioEvents, flags & AIO_RW); }