static void paStreamCbSuccess(pa_stream *pStream, int fSuccess, void *pvUser) { AssertPtrReturnVoid(pStream); PPULSEAUDIOSTREAM pStrm = (PPULSEAUDIOSTREAM)pvUser; AssertPtrReturnVoid(pStrm); pStrm->fOpSuccess = fSuccess; if (fSuccess) paSignalWaiter(pStrm->pDrv); else paError(pStrm->pDrv, "Failed to finish stream operation"); }
/** * Callback called when our pa_stream_drain operation was completed. */ static void paStreamCbDrain(pa_stream *pStream, int fSuccess, void *pvUser) { AssertPtrReturnVoid(pStream); PPULSEAUDIOSTREAM pStrm = (PPULSEAUDIOSTREAM)pvUser; AssertPtrReturnVoid(pStrm); pStrm->fOpSuccess = fSuccess; if (fSuccess) { pa_operation_unref(pa_stream_cork(pStream, 1, paStreamCbSuccess, pvUser)); } else paError(pStrm->pDrv, "Failed to drain stream"); if (pStrm->pDrainOp) { pa_operation_unref(pStrm->pDrainOp); pStrm->pDrainOp = NULL; } }
// Read one line of tokens. It is up to the caller to destroy these tokens. // Read up to a newline or a BEGIN token. static bool readOneLine(void) { printf("Reading one line\n"); paSyntax syntax; paStaterule staterule; paToken token; utSym subSyntaxSym; if(paNextBeginToken == paTokenNull) { token = paLex(); } else { token = paNextBeginToken; paNextBeginToken = paTokenNull; } if(token == paTokenNull) { return false; } // Now deal with BEGIN/END tokens. if(paTokenGetType(token) == PA_TOK_BEGIN) { printf("Starting sub-statements\n"); if(paPrevStatement == paStatementNull) { paError(token, "First line may not be intented"); } paOuterStatement = paPrevStatement; subSyntaxSym = paStateruleGetSubSyntaxSym(paStatementGetStaterule(paOuterStatement)); if(subSyntaxSym != utSymNull) { syntax = paRootFindSyntax(paTheRoot, subSyntaxSym); if(syntax != paSyntaxNull) { printf("Using syntax %s\n", paSyntaxGetName(syntax)); paCurrentSyntax = syntax; } else { paError(token, "Syntax %s not found", utSymGetName(subSyntaxSym)); } } paTokenDestroy(token); token = paLex(); if(paTokenGetType(token) == PA_TOK_NEWLINE) { paTokenDestroy(token); token = paLex(); } } while(token != paTokenNull && paTokenGetType(token) == PA_TOK_END) { printf("Finished sub-statements\n"); paOuterStatement = paStatementGetStatement(paOuterStatement); staterule = paStatementGetStaterule(paOuterStatement); if(staterule == paStateruleNull) { syntax = paTopSyntax; } else { syntax = paRootFindSyntax(paTheRoot, paStateruleGetSubSyntaxSym(staterule)); if(syntax == paSyntaxNull) { syntax = paStateruleGetSyntax(staterule); } } if(syntax != paCurrentSyntax) { printf("Using syntax %s\n", paSyntaxGetName(syntax)); paCurrentSyntax = syntax; } paTokenDestroy(token); token = paLex(); if(paTokenGetType(token) == PA_TOK_NEWLINE) { paTokenDestroy(token); token = paLex(); } } while(token != paTokenNull && paTokenGetType(token) != PA_TOK_NEWLINE && paTokenGetType(token) != PA_TOK_BEGIN) { if(paTokenGetType(token) == PA_TOK_CHAR) { // Every character should be matched by some other token paError(token, "Illegal character in input"); } paSyntaxAppendToken(paCurrentSyntax, token); paPrintToken(token); token = paLex(); } if(token != paTokenNull) { if(paTokenGetType(token) == PA_TOK_BEGIN) { paNextBeginToken = token; } else { paTokenDestroy(token); // We no longer need the NEWLINE token } } return paSyntaxGetUsedToken(paCurrentSyntax) > 0; }