void nsNativeAudioStream::Resume() { if (mInError) return; mPaused = false; sa_stream_resume(static_cast<sa_stream_t*>(mAudioHandle)); }
int sa_stream_write(sa_stream_t *s, const void *data, size_t nbytes) { if (s == NULL || s->output_unit == NULL) { return SA_ERROR_NO_INIT; } if (nbytes == 0) { return SA_SUCCESS; } JNIEnv *jenv = GetJNIForThread(); if ((*jenv)->PushLocalFrame(jenv, 2)) { return SA_ERROR_OOM; } jbyteArray bytearray = (*jenv)->NewByteArray(jenv, nbytes); if (!bytearray) { (*jenv)->ExceptionClear(jenv); (*jenv)->PopLocalFrame(jenv, NULL); return SA_ERROR_OOM; } jbyte *byte = (*jenv)->GetByteArrayElements(jenv, bytearray, NULL); if (!byte) { (*jenv)->PopLocalFrame(jenv, NULL); return SA_ERROR_OOM; } memcpy(byte, data, nbytes); size_t wroteSoFar = 0; jint retval; do { retval = (*jenv)->CallIntMethod(jenv, s->output_unit, at.write, bytearray, wroteSoFar, nbytes - wroteSoFar); if (retval < 0) { ALOG("%x - Write failed %d", s, retval); break; } wroteSoFar += retval; if (wroteSoFar != nbytes) { /* android doesn't start playing until we explictly call play. */ if (!s->isPaused) sa_stream_resume(s); struct timespec ts = {0, 100000000}; /* .10s */ nanosleep(&ts, NULL); } } while(wroteSoFar < nbytes); s->amountWritten += nbytes; (*jenv)->ReleaseByteArrayElements(jenv, bytearray, byte, 0); (*jenv)->PopLocalFrame(jenv, NULL); return retval < 0 ? SA_ERROR_INVALID : SA_SUCCESS; }