static int dequeueKeyEvent (unsigned char *set, unsigned char *key, int *press) { Queue *queue = getKeyEventQueue(0); if (keyReleaseEvent) { if (afterTimePeriod(&keyReleasePeriod, NULL)) { if (!addKeyEvent(keyReleaseEvent)) return 0; keyReleaseEvent = NULL; } } if (queue) { KeyEvent *event; while ((event = dequeueItem(queue))) { #ifdef ENABLE_API if (apiStarted) { if ((api_handleKeyEvent(event->set, event->key, event->press)) == EOF) { deallocateKeyEvent(event); continue; } } #endif /* ENABLE_API */ *set = event->set; *key = event->key; *press = event->press; deallocateKeyEvent(event); return 1; } } return 0; }
static void synthesizeSpeechSegments (void) { SpeechSegment *segment; while ((segment = dequeueItem(speechQueue))) { if (segment->tags) { synthesizeSpeechSegment(segment); } else if (synthesisThreadStarted && openSoundDevice()) { pthread_mutex_unlock(&speechMutex); synthesizeSpeechSegment(segment); pthread_mutex_lock(&speechMutex); } deallocateSpeechSegment(segment); } }
void * usbReapResponse ( UsbDevice *device, unsigned char endpointAddress, UsbResponse *response, int wait ) { UsbEndpoint *endpoint; if ((endpoint = usbGetEndpoint(device, endpointAddress))) { UsbEndpointExtension *eptx = endpoint->extension; struct usbdevfs_urb *urb; while (!(urb = dequeueItem(eptx->completedRequests))) { if (!usbReapUrb(device, wait)) return NULL; } response->context = urb->usercontext; response->buffer = urb->buffer; response->size = urb->buffer_length; if ((response->error = urb->status)) { if (response->error < 0) response->error = -response->error; errno = response->error; logSystemError("USB URB status"); response->count = -1; } else { response->count = urb->actual_length; switch (USB_ENDPOINT_DIRECTION(endpoint->descriptor)) { case UsbEndpointDirection_Input: if (!usbApplyInputFilters(device, response->buffer, response->size, &response->count)) { response->error = EIO; response->count = -1; } break; } } return urb; } return NULL; }
static int dequeueCommand (Queue *queue) { CommandQueueItem *item; while ((item = dequeueItem(queue))) { int command = item->command; free(item); #ifdef ENABLE_API if (apiStarted) { if ((command = api_handleCommand(command)) == EOF) { continue; } } #endif /* ENABLE_API */ return command; } return EOF; }
void * usbReapResponse ( UsbDevice *device, unsigned char endpointAddress, UsbResponse *response, int wait ) { UsbEndpoint *endpoint; if ((endpoint = usbGetEndpoint(device, endpointAddress))) { UsbEndpointExtension *eptx = endpoint->extension; struct timeval timeout; UsbAsynchronousRequest *request; timeout.tv_sec = 0; timeout.tv_usec = 0; while (!(request = dequeueItem(eptx->requests))) { aio_result_t *result; doWait: if ((int)(result = aiowait(wait? NULL: &timeout)) == -1) { if (errno == EINTR) goto doWait; if (errno != EINVAL) { logSystemError("USB asynchronous wait"); return NULL; } result = NULL; } if (!result) { errno = EAGAIN; return NULL; } request = (UsbAsynchronousRequest *)result; { UsbEndpoint *ep = request->endpoint; UsbEndpointExtension *epx = ep->extension; if (!enqueueItem(epx->requests, request)) { logSystemError("USB asynchronous enqueue"); } } } response->context = request->context; response->buffer = request->buffer; response->size = request->length; response->count = request->result.aio_return; response->error = request->result.aio_errno; if (response->count == -1) { errno = response->error; logSystemError("USB asynchronous completion"); } else { switch (USB_ENDPOINT_DIRECTION(endpoint->descriptor)) { case UsbEndpointDirection_Input: if (!usbApplyInputFilters(endpoint, response->buffer, response->size, &response->count)) { response->error = EIO; response->count = -1; } break; } } return request; } return NULL; }
/** * Flushes the submit queues */ void ScrobblerSubmitter::performSubmit() { QString data; // Audioscrobbler accepts max 10 tracks on one submit. SubmitItem* items[10]; for ( int submitCounter = 0; submitCounter < 10; submitCounter++ ) items[submitCounter] = 0; if ( PROTOCOL_VERSION == "1.1" ) { // Audioscrobbler protocol 1.1 (current) // http://post.audioscrobbler.com/v1.1-lite.php // u=<user> // &s=<MD5 response>& // a[0]=<artist 0>&t[0]=<track 0>&b[0]=<album 0>& // m[0]=<mbid 0>&l[0]=<length 0>&i[0]=<time 0>& // a[1]=<artist 1>&t[1]=<track 1>&b[1]=<album 1>& // m[1]=<mbid 1>&l[1]=<length 1>&i[1]=<time 1>& // ... // a[n]=<artist n>&t[n]=<track n>&b[n]=<album n>& // m[n]=<mbid n>&l[n]=<length n>&i[n]=<time n>& data = "u=" + KURL::encode_string_no_slash( m_username ) + "&s=" + KURL::encode_string_no_slash( KMD5( KMD5( m_password.utf8() ).hexDigest() + m_challenge.utf8() ).hexDigest() ); m_submitQueue.first(); for ( int submitCounter = 0; submitCounter < 10; submitCounter++ ) { SubmitItem* itemFromQueue = dequeueItem(); if ( itemFromQueue == 0 ) { if( submitCounter == 0 ) { // this shouldn't happen, since we shouldn't be scheduled until we have something to do! debug() << "Nothing to submit!" << endl; return; } else { break; } } else data += '&'; items[submitCounter] = itemFromQueue; QDateTime playStartTime = QDateTime(); playStartTime.setTime_t( itemFromQueue->playStartTime() ); const QString count = QString::number( submitCounter ); data += "a[" + count + "]=" + KURL::encode_string_no_slash( itemFromQueue->artist(), 106 /*utf-8*/ ) + "&t[" + count + "]=" + KURL::encode_string_no_slash( itemFromQueue->title(), 106 /*utf-8*/ ) + "&b[" + count + "]=" + KURL::encode_string_no_slash( itemFromQueue->album(), 106 /*utf-8*/ ) + "&m[" + count + "]=" + "&l[" + count + "]=" + QString::number( itemFromQueue->length() ) + "&i[" + count + "]=" + KURL::encode_string_no_slash( playStartTime.toString( "yyyy-MM-dd hh:mm:ss" ) ); } } else { debug() << "Submit not implemented for protocol version: " << PROTOCOL_VERSION << endl; return; } debug() << "Submit data: " << data << endl; m_submitResultBuffer = ""; m_inProgress = true; KIO::TransferJob* job = KIO::http_post( m_submitUrl, data.utf8(), false ); job->addMetaData( "content-type", "Content-Type: application/x-www-form-urlencoded" ); // Loop in reverse order, which helps when items are later fetched from // m_ongoingSubmits and possibly put back to queue, in correct order // (i.e. oldest first). for ( int submitCounter = 9; submitCounter >= 0; submitCounter-- ) if ( items[submitCounter] != 0 ) m_ongoingSubmits.insert( job, items[submitCounter] ); Amarok::StatusBar::instance()->newProgressOperation( job ) .setDescription( i18n( "Submitting to last.fm" ) ); connect( job, SIGNAL( result( KIO::Job* ) ), this, SLOT( audioScrobblerSubmitResult( KIO::Job* ) ) ); connect( job, SIGNAL( data( KIO::Job*, const QByteArray& ) ), this, SLOT( audioScrobblerSubmitData( KIO::Job*, const QByteArray& ) ) ); }