libexplain  1.4.D001
libexplain/buffer/v4l2_audio.c
Go to the documentation of this file.
00001 /*
00002  * libexplain - a library of system-call-specific strerror replacements
00003  * Copyright (C) 2011, 2013 Peter Miller
00004  *
00005  * This program is free software; you can redistribute it and/or modify
00006  * it under the terms of the GNU Lesser General Public License as
00007  * published by the Free Software Foundation; either version 3 of the
00008  * License, or (at your option) any later version.
00009  *
00010  * This program is distributed in the hope that it will be useful,
00011  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00012  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00013  * Lesser General Public License for more details.
00014  *
00015  * You should have received a copy of the GNU Lesser General Public License
00016  * along with this program. If not, see <http://www.gnu.org/licenses/>.
00017  */
00018 
00019 #include <libexplain/ac/errno.h>
00020 #include <libexplain/ac/linux/videodev2.h>
00021 #include <libexplain/ac/string.h>
00022 #include <libexplain/ac/sys/ioctl.h>
00023 
00024 #include <libexplain/buffer/int32_t.h>
00025 #include <libexplain/buffer/pointer.h>
00026 #include <libexplain/buffer/v4l2_audio.h>
00027 #include <libexplain/buffer/v4l2_audio_capability.h>
00028 #include <libexplain/buffer/v4l2_audio_mode.h>
00029 #include <libexplain/is_efault.h>
00030 #include <libexplain/sizeof.h>
00031 
00032 
00033 #ifdef HAVE_LINUX_VIDEODEV2_H
00034 
00035 void
00036 explain_buffer_v4l2_audio(explain_string_buffer_t *sb,
00037     const struct v4l2_audio *data, int extra)
00038 {
00039     if (explain_is_efault_pointer(data, sizeof(*data)))
00040     {
00041         explain_buffer_pointer(sb, data);
00042         return;
00043     }
00044 
00045     explain_string_buffer_puts(sb, "{ index = ");
00046     explain_buffer_uint32_t(sb, data->index);
00047     if (extra)
00048     {
00049         explain_string_buffer_puts(sb, ", name = ");
00050         explain_string_buffer_putsu_quoted_n(sb, data->name,
00051             sizeof(data->name));
00052         explain_string_buffer_puts(sb, ", capability = ");
00053         explain_buffer_v4l2_audio_capability(sb, data->capability);
00054         explain_string_buffer_puts(sb, ", mode = ");
00055         explain_buffer_v4l2_audio_mode(sb, data->mode);
00056         if (!explain_uint32_array_all_zero(data->reserved,
00057             SIZEOF(data->reserved)))
00058         {
00059             explain_string_buffer_puts(sb, ", reserved = ");
00060             explain_buffer_uint32_array(sb, data->reserved,
00061                 SIZEOF(data->reserved));
00062         }
00063     }
00064     explain_string_buffer_puts(sb, " }");
00065 }
00066 
00067 
00068 void
00069 explain_buffer_v4l2_audio_index(explain_string_buffer_t *sb, int value,
00070     int fildes)
00071 {
00072     struct v4l2_audio qry;
00073 
00074     explain_buffer_uint32_t(sb, value);
00075 
00076     memset(&qry, 0, sizeof(qry));
00077     qry.index = value;
00078     if (ioctl(fildes, VIDIOC_ENUMAUDIO, &qry) >= 0)
00079     {
00080         explain_string_buffer_putc(sb, ' ');
00081         explain_string_buffer_putsu_quoted_n(sb, qry.name, sizeof(qry.name));
00082     }
00083 }
00084 
00085 
00086 void
00087 explain_buffer_v4l2_audio_index_ptr(explain_string_buffer_t *sb,
00088     const int *data, int fildes)
00089 {
00090     if (explain_is_efault_pointer(data, sizeof(*data)))
00091     {
00092         explain_buffer_pointer(sb, data);
00093         return;
00094     }
00095 
00096     explain_string_buffer_puts(sb, "{ ");
00097     explain_buffer_v4l2_audio_index(sb, *data, fildes);
00098     explain_string_buffer_puts(sb, " }");
00099 }
00100 
00101 
00102 int
00103 explain_v4l2_audio_get_naudios(int fildes)
00104 {
00105     int lo = 0;
00106     int hi = 200;
00107     for (;;)
00108     {
00109         int mid = (lo + hi) / 2;
00110         struct v4l2_audio qry;
00111         memset(&qry, 0, sizeof(qry));
00112         qry.index = mid;
00113         if (ioctl(fildes, VIDIOC_ENUMAUDIO, &qry) >= 0)
00114         {
00115             if (hi <= 0 && lo <= 0)
00116                 return -1;
00117             /* mid < naudios */
00118             lo = mid + 1;
00119             if (lo > hi)
00120                 return lo;
00121         }
00122         else if (errno != EINVAL)
00123         {
00124             return -1;
00125         }
00126         else
00127         {
00128             if (hi <= 0 && lo <= 0)
00129                 return -1;
00130             /* mid >= naudios */
00131             hi = mid - 1;
00132             if (lo >= hi)
00133                 return lo;
00134         }
00135     }
00136 }
00137 
00138 #else
00139 
00140 void
00141 explain_buffer_v4l2_audio(explain_string_buffer_t *sb,
00142     const struct v4l2_audio *data, int extra)
00143 {
00144     explain_buffer_pointer(sb, data);
00145 }
00146 
00147 #endif
00148 
00149 
00150 /* vim: set ts=8 sw=4 et : */