Lines Matching refs:hctl

91 	snd_hctl_t *hctl;
95 if ((hctl = (snd_hctl_t *)calloc(1, sizeof(snd_hctl_t))) == NULL)
97 INIT_LIST_HEAD(&hctl->elems);
98 hctl->ctl = ctl;
99 *hctlp = hctl;
105 * \param hctl HCTL handle
111 int snd_hctl_close(snd_hctl_t *hctl)
115 assert(hctl);
116 err = snd_ctl_close(hctl->ctl);
117 snd_hctl_free(hctl);
118 free(hctl);
124 * \param hctl HCTL handle
130 const char *snd_hctl_name(snd_hctl_t *hctl)
132 assert(hctl);
133 return snd_ctl_name(hctl->ctl);
138 * \param hctl HCTL handle
142 int snd_hctl_nonblock(snd_hctl_t *hctl, int nonblock)
144 assert(hctl);
145 return snd_ctl_nonblock(hctl->ctl, nonblock);
150 * \param hctl HCTL handle
157 int snd_hctl_async(snd_hctl_t *hctl, int sig, pid_t pid)
159 assert(hctl);
160 return snd_ctl_async(hctl->ctl, sig, pid);
165 * \param hctl HCTL handle
168 int snd_hctl_poll_descriptors_count(snd_hctl_t *hctl)
170 assert(hctl);
171 return snd_ctl_poll_descriptors_count(hctl->ctl);
176 * \param hctl HCTL handle
181 int snd_hctl_poll_descriptors(snd_hctl_t *hctl, struct pollfd *pfds, unsigned int space)
183 assert(hctl);
184 return snd_ctl_poll_descriptors(hctl->ctl, pfds, space);
189 * \param hctl HCTL handle
195 int snd_hctl_poll_descriptors_revents(snd_hctl_t *hctl, struct pollfd *pfds, unsigned int nfds, unsigned short *revents)
197 assert(hctl);
198 return snd_ctl_poll_descriptors_revents(hctl->ctl, pfds, nfds, revents);
201 static int snd_hctl_throw_event(snd_hctl_t *hctl, unsigned int mask,
204 if (hctl->callback)
205 return hctl->callback(hctl, mask, elem);
320 static int _snd_hctl_find_elem(snd_hctl_t *hctl, const snd_ctl_elem_id_t *id, int *dir)
326 assert(hctl && id);
327 assert(hctl->compare);
331 u = hctl->count;
334 c = hctl->compare(&el, hctl->pelems[idx]);
346 static int snd_hctl_elem_add(snd_hctl_t *hctl, snd_hctl_elem_t *elem)
351 if (hctl->count == hctl->alloc) {
353 hctl->alloc += 32;
354 h = realloc(hctl->pelems, sizeof(*h) * hctl->alloc);
356 hctl->alloc -= 32;
359 hctl->pelems = h;
361 if (hctl->count == 0) {
362 list_add_tail(&elem->list, &hctl->elems);
363 hctl->pelems[0] = elem;
365 idx = _snd_hctl_find_elem(hctl, &elem->id, &dir);
368 list_add(&elem->list, &hctl->pelems[idx]->list);
371 list_add_tail(&elem->list, &hctl->pelems[idx]->list);
373 memmove(hctl->pelems + idx + 1,
374 hctl->pelems + idx,
375 (hctl->count - idx) * sizeof(snd_hctl_elem_t *));
376 hctl->pelems[idx] = elem;
378 hctl->count++;
379 return snd_hctl_throw_event(hctl, SNDRV_CTL_EVENT_MASK_ADD, elem);
382 static void snd_hctl_elem_remove(snd_hctl_t *hctl, unsigned int idx)
384 snd_hctl_elem_t *elem = hctl->pelems[idx];
389 hctl->count--;
390 m = hctl->count - idx;
392 memmove(hctl->pelems + idx,
393 hctl->pelems + idx + 1,
399 * \param hctl HCTL handle
402 int snd_hctl_free(snd_hctl_t *hctl)
404 while (hctl->count > 0)
405 snd_hctl_elem_remove(hctl, hctl->count - 1);
406 free(hctl->pelems);
407 hctl->pelems = 0;
408 hctl->alloc = 0;
409 INIT_LIST_HEAD(&hctl->elems);
419 static void snd_hctl_sort(snd_hctl_t *hctl)
426 assert(hctl);
427 assert(hctl->compare);
428 INIT_LIST_HEAD(&hctl->elems);
433 compare_hctl = hctl;
434 qsort(hctl->pelems, hctl->count, sizeof(*hctl->pelems), hctl_compare);
438 for (k = 0; k < hctl->count; k++)
439 list_add_tail(&hctl->pelems[k]->list, &hctl->elems);
444 * \param hctl HCTL handle
448 int snd_hctl_set_compare(snd_hctl_t *hctl, snd_hctl_compare_t compare)
450 assert(hctl);
451 hctl->compare = compare == NULL ? snd_hctl_compare_default : compare;
452 snd_hctl_sort(hctl);
495 * \param hctl HCTL handle
498 snd_hctl_elem_t *snd_hctl_first_elem(snd_hctl_t *hctl)
500 assert(hctl);
501 if (list_empty(&hctl->elems))
503 return list_entry(hctl->elems.next, snd_hctl_elem_t, list);
508 * \param hctl HCTL handle
511 snd_hctl_elem_t *snd_hctl_last_elem(snd_hctl_t *hctl)
513 assert(hctl);
514 if (list_empty(&hctl->elems))
516 return list_entry(hctl->elems.prev, snd_hctl_elem_t, list);
527 if (elem->list.next == &elem->hctl->elems)
540 if (elem->list.prev == &elem->hctl->elems)
547 * \param hctl HCTL handle
551 snd_hctl_elem_t *snd_hctl_find_elem(snd_hctl_t *hctl, const snd_ctl_elem_id_t *id)
554 int res = _snd_hctl_find_elem(hctl, id, &dir);
557 return hctl->pelems[res];
562 * \param hctl HCTL handle
565 int snd_hctl_load(snd_hctl_t *hctl)
571 assert(hctl);
572 assert(hctl->ctl);
573 assert(hctl->count == 0);
574 assert(list_empty(&hctl->elems));
576 if ((err = snd_ctl_elem_list(hctl->ctl, &list)) < 0)
582 if ((err = snd_ctl_elem_list(hctl->ctl, &list)) < 0)
585 if (hctl->alloc < list.count) {
586 hctl->alloc = list.count;
587 free(hctl->pelems);
588 hctl->pelems = malloc(hctl->alloc * sizeof(*hctl->pelems));
589 if (!hctl->pelems) {
598 snd_hctl_free(hctl);
603 elem->hctl = hctl;
605 hctl->pelems[idx] = elem;
606 list_add_tail(&elem->list, &hctl->elems);
607 hctl->count++;
609 if (!hctl->compare)
610 hctl->compare = snd_hctl_compare_default;
611 snd_hctl_sort(hctl);
612 for (idx = 0; idx < hctl->count; idx++) {
613 int res = snd_hctl_throw_event(hctl, SNDRV_CTL_EVENT_MASK_ADD,
614 hctl->pelems[idx]);
618 err = snd_ctl_subscribe_events(hctl->ctl, 1);
626 * \param hctl HCTL handle
629 void snd_hctl_set_callback(snd_hctl_t *hctl, snd_hctl_callback_t callback)
631 assert(hctl);
632 hctl->callback = callback;
637 * \param hctl HCTL handle
640 void snd_hctl_set_callback_private(snd_hctl_t *hctl, void *callback_private)
642 assert(hctl);
643 hctl->callback_private = callback_private;
648 * \param hctl HCTL handle
651 void *snd_hctl_get_callback_private(snd_hctl_t *hctl)
653 assert(hctl);
654 return hctl->callback_private;
659 * \param hctl HCTL handle
662 unsigned int snd_hctl_get_count(snd_hctl_t *hctl)
664 return hctl->count;
669 * \param hctl HCTL handle
675 int snd_hctl_wait(snd_hctl_t *hctl, int timeout)
681 npfds = snd_hctl_poll_descriptors_count(hctl);
688 err = snd_hctl_poll_descriptors(hctl, pfd, npfds);
699 if (errno == EINTR && !CTLINABORT(hctl->ctl) && !(hctl->ctl->mode & SND_CTL_EINTR))
705 err = snd_hctl_poll_descriptors_revents(hctl, pfd, npfds, revents);
720 * \brief Get a ctl handle associated to the given hctl handle
721 * \param hctl HCTL handle
724 snd_ctl_t *snd_hctl_ctl(snd_hctl_t *hctl)
726 return hctl->ctl;
729 static int snd_hctl_handle_event(snd_hctl_t *hctl, snd_ctl_event_t *event)
734 assert(hctl);
735 assert(hctl->ctl);
744 res = _snd_hctl_find_elem(hctl, &event->data.elem.id, &dir);
747 snd_hctl_elem_remove(hctl, (unsigned int) res);
755 elem->hctl = hctl;
756 res = snd_hctl_elem_add(hctl, elem);
762 elem = snd_hctl_find_elem(hctl, &event->data.elem.id);
776 * \param hctl HCTL handle
779 int snd_hctl_handle_events(snd_hctl_t *hctl)
785 assert(hctl);
786 assert(hctl->ctl);
787 while ((res = snd_ctl_read(hctl->ctl, &event)) != 0 &&
791 res = snd_hctl_handle_event(hctl, &event);
808 assert(elem->hctl);
811 return snd_ctl_elem_info(elem->hctl->ctl, info);
823 assert(elem->hctl);
826 return snd_ctl_elem_read(elem->hctl->ctl, value);
840 assert(elem->hctl);
843 return snd_ctl_elem_write(elem->hctl->ctl, value);
858 return snd_ctl_elem_tlv_read(elem->hctl->ctl, &elem->id, tlv, tlv_size);
874 return snd_ctl_elem_tlv_write(elem->hctl->ctl, &elem->id, tlv);
890 return snd_ctl_elem_tlv_command(elem->hctl->ctl, &elem->id, tlv);
901 return elem->hctl;