|
Packit Service |
cd2a00 |
/*
|
|
Packit Service |
cd2a00 |
* ALSA -> Arcam AV control plugin
|
|
Packit Service |
cd2a00 |
*
|
|
Packit Service |
cd2a00 |
* Copyright (c) 2009 by Peter Stokes <linux@dadeos.co.uk>
|
|
Packit Service |
cd2a00 |
*
|
|
Packit Service |
cd2a00 |
* This library is free software; you can redistribute it and/or modify
|
|
Packit Service |
cd2a00 |
* it under the terms of the GNU Lesser General Public License as
|
|
Packit Service |
cd2a00 |
* published by the Free Software Foundation; either version 2.1 of
|
|
Packit Service |
cd2a00 |
* the License, or (at your option) any later version.
|
|
Packit Service |
cd2a00 |
*
|
|
Packit Service |
cd2a00 |
* This program is distributed in the hope that it will be useful,
|
|
Packit Service |
cd2a00 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit Service |
cd2a00 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
Packit Service |
cd2a00 |
* GNU Lesser General Public License for more details.
|
|
Packit Service |
cd2a00 |
*
|
|
Packit Service |
cd2a00 |
* You should have received a copy of the GNU Lesser General Public
|
|
Packit Service |
cd2a00 |
* License along with this library; if not, write to the Free Software
|
|
Packit Service |
cd2a00 |
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
Packit Service |
cd2a00 |
*/
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
#include <sys/socket.h>
|
|
Packit Service |
cd2a00 |
#include <alsa/asoundlib.h>
|
|
Packit Service |
cd2a00 |
#include <alsa/control_external.h>
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
#include "arcam_av.h"
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
|
|
Packit Service |
cd2a00 |
#define MIN(a, b) ((a) < (b) ? (a) : (b))
|
|
Packit Service |
cd2a00 |
#define MID(a, b, c) ((a) < (b) ? ((b) < (c) ? (b) : ((a) < (c) ? (c) : (a))) \
|
|
Packit Service |
cd2a00 |
: ((b) > (c) ? (b) : ((a) > (c) ? (c) : (a))))
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
static const char* arcam_av_name = "Arcam AV";
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
static const struct {
|
|
Packit Service |
cd2a00 |
arcam_av_cc_t code;
|
|
Packit Service |
cd2a00 |
const char* name;
|
|
Packit Service |
cd2a00 |
} arcam_av_zone1[] = {
|
|
Packit Service |
cd2a00 |
{ARCAM_AV_POWER, "Power Switch" },
|
|
Packit Service |
cd2a00 |
{ARCAM_AV_VOLUME_SET, "Master Playback Volume" },
|
|
Packit Service |
cd2a00 |
{ARCAM_AV_MUTE, "Master Playback Switch" },
|
|
Packit Service |
cd2a00 |
{ARCAM_AV_DIRECT, "Direct Playback Switch" },
|
|
Packit Service |
cd2a00 |
{ARCAM_AV_SOURCE, "Source Playback Route" },
|
|
Packit Service |
cd2a00 |
{ARCAM_AV_SOURCE_TYPE, "Source Type Playback Route" },
|
|
Packit Service |
cd2a00 |
{ARCAM_AV_STEREO_DECODE, "Stereo Decode Playback Route" },
|
|
Packit Service |
cd2a00 |
{ARCAM_AV_MULTI_DECODE, "Multi-Channel Decode Playback Route" },
|
|
Packit Service |
cd2a00 |
{ARCAM_AV_STEREO_EFFECT, "Stereo Effect Playback Route" }
|
|
Packit Service |
cd2a00 |
};
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
static const struct {
|
|
Packit Service |
cd2a00 |
arcam_av_cc_t code;
|
|
Packit Service |
cd2a00 |
const char* name;
|
|
Packit Service |
cd2a00 |
} arcam_av_zone2[] = {
|
|
Packit Service |
cd2a00 |
{ARCAM_AV_POWER, "Power Switch" },
|
|
Packit Service |
cd2a00 |
{ARCAM_AV_VOLUME_SET, "Master Playback Volume" },
|
|
Packit Service |
cd2a00 |
{ARCAM_AV_MUTE, "Master Playback Switch" },
|
|
Packit Service |
cd2a00 |
{ARCAM_AV_SOURCE, "Source Playback Route" }
|
|
Packit Service |
cd2a00 |
};
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
static const struct {
|
|
Packit Service |
cd2a00 |
arcam_av_source_t code;
|
|
Packit Service |
cd2a00 |
const char* name;
|
|
Packit Service |
cd2a00 |
} arcam_av_sources[] = {
|
|
Packit Service |
cd2a00 |
{ARCAM_AV_SOURCE_DVD, "DVD" },
|
|
Packit Service |
cd2a00 |
{ARCAM_AV_SOURCE_SAT, "SAT" },
|
|
Packit Service |
cd2a00 |
{ARCAM_AV_SOURCE_AV, "AV" },
|
|
Packit Service |
cd2a00 |
{ARCAM_AV_SOURCE_PVR, "PVR" },
|
|
Packit Service |
cd2a00 |
{ARCAM_AV_SOURCE_VCR, "VCR" },
|
|
Packit Service |
cd2a00 |
{ARCAM_AV_SOURCE_CD, "CD" },
|
|
Packit Service |
cd2a00 |
{ARCAM_AV_SOURCE_FM, "FM" },
|
|
Packit Service |
cd2a00 |
{ARCAM_AV_SOURCE_AM, "AM" },
|
|
Packit Service |
cd2a00 |
{ARCAM_AV_SOURCE_DVDA, "DVDA" }
|
|
Packit Service |
cd2a00 |
};
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
static const struct {
|
|
Packit Service |
cd2a00 |
arcam_av_source_type_t code;
|
|
Packit Service |
cd2a00 |
const char* name;
|
|
Packit Service |
cd2a00 |
} arcam_av_source_types[] = {
|
|
Packit Service |
cd2a00 |
{ARCAM_AV_SOURCE_TYPE_ANALOGUE, "Analogue" },
|
|
Packit Service |
cd2a00 |
{ARCAM_AV_SOURCE_TYPE_DIGITAL, "Digital" }
|
|
Packit Service |
cd2a00 |
};
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
static const struct {
|
|
Packit Service |
cd2a00 |
arcam_av_direct_t code;
|
|
Packit Service |
cd2a00 |
const char* name;
|
|
Packit Service |
cd2a00 |
} arcam_av_direct[] = {
|
|
Packit Service |
cd2a00 |
{ARCAM_AV_DIRECT_DISABLE, "Disable" },
|
|
Packit Service |
cd2a00 |
{ARCAM_AV_DIRECT_ENABLE, "Enable" }
|
|
Packit Service |
cd2a00 |
};
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
static const struct {
|
|
Packit Service |
cd2a00 |
arcam_av_stereo_decode_t code;
|
|
Packit Service |
cd2a00 |
const char* name;
|
|
Packit Service |
cd2a00 |
} arcam_av_stereo_decode_modes[] = {
|
|
Packit Service |
cd2a00 |
{ARCAM_AV_STEREO_DECODE_MONO, "Mono" },
|
|
Packit Service |
cd2a00 |
{ARCAM_AV_STEREO_DECODE_STEREO, "Stereo" },
|
|
Packit Service |
cd2a00 |
{ARCAM_AV_STEREO_DECODE_PLII_MOVIE, "Pro Logic II Movie" },
|
|
Packit Service |
cd2a00 |
{ARCAM_AV_STEREO_DECODE_PLII_MUSIC, "Pro Logic II Music" },
|
|
Packit Service |
cd2a00 |
{ARCAM_AV_STEREO_DECODE_PLIIx_MOVIE, "Pro Logic IIx Movie" },
|
|
Packit Service |
cd2a00 |
{ARCAM_AV_STEREO_DECODE_PLIIx_MUSIC, "Pro Logic IIx Music" },
|
|
Packit Service |
cd2a00 |
{ARCAM_AV_STEREO_DECODE_DOLBY_PL, "Dolby Pro Logic" },
|
|
Packit Service |
cd2a00 |
{ARCAM_AV_STEREO_DECODE_NEO6_CINEMA, "Neo:6 Cinema" },
|
|
Packit Service |
cd2a00 |
{ARCAM_AV_STEREO_DECODE_NEO6_MUSIC, "Neo:6 Music" }
|
|
Packit Service |
cd2a00 |
};
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
static const struct {
|
|
Packit Service |
cd2a00 |
arcam_av_multi_decode_t code;
|
|
Packit Service |
cd2a00 |
const char* name;
|
|
Packit Service |
cd2a00 |
} arcam_av_multi_decode_modes[] = {
|
|
Packit Service |
cd2a00 |
{ARCAM_AV_MULTI_DECODE_MONO, "Mono down-mix" },
|
|
Packit Service |
cd2a00 |
{ARCAM_AV_MULTI_DECODE_STEREO, "Stereo down-mix" },
|
|
Packit Service |
cd2a00 |
{ARCAM_AV_MULTI_DECODE_MULTI_CHANNEL, "Multi-channel" },
|
|
Packit Service |
cd2a00 |
{ARCAM_AV_MULTI_DECODE_PLIIx, "Pro Logic IIx" }
|
|
Packit Service |
cd2a00 |
};
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
static const struct {
|
|
Packit Service |
cd2a00 |
arcam_av_stereo_effect_t code;
|
|
Packit Service |
cd2a00 |
const char* name;
|
|
Packit Service |
cd2a00 |
} arcam_av_stereo_effects[] = {
|
|
Packit Service |
cd2a00 |
{ARCAM_AV_STEREO_EFFECT_NONE, "None" },
|
|
Packit Service |
cd2a00 |
{ARCAM_AV_STEREO_EFFECT_MUSIC, "Music" },
|
|
Packit Service |
cd2a00 |
{ARCAM_AV_STEREO_EFFECT_PARTY, "Party" },
|
|
Packit Service |
cd2a00 |
{ARCAM_AV_STEREO_EFFECT_CLUB, "Club" },
|
|
Packit Service |
cd2a00 |
{ARCAM_AV_STEREO_EFFECT_HALL, "Hall" },
|
|
Packit Service |
cd2a00 |
{ARCAM_AV_STEREO_EFFECT_SPORTS, "Sports" },
|
|
Packit Service |
cd2a00 |
{ARCAM_AV_STEREO_EFFECT_CHURCH, "Church" }
|
|
Packit Service |
cd2a00 |
};
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
typedef struct snd_ctl_arcam_av {
|
|
Packit Service |
cd2a00 |
snd_ctl_ext_t ext;
|
|
Packit Service |
cd2a00 |
int port_fd;
|
|
Packit Service |
cd2a00 |
int shm_id;
|
|
Packit Service |
cd2a00 |
const char* port;
|
|
Packit Service |
cd2a00 |
arcam_av_zone_t zone;
|
|
Packit Service |
cd2a00 |
arcam_av_state_t local;
|
|
Packit Service |
cd2a00 |
arcam_av_state_t* global;
|
|
Packit Service |
cd2a00 |
pthread_t server;
|
|
Packit Service |
cd2a00 |
} snd_ctl_arcam_av_t;
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
static void arcam_av_close(snd_ctl_ext_t *ext)
|
|
Packit Service |
cd2a00 |
{
|
|
Packit Service |
cd2a00 |
snd_ctl_arcam_av_t *arcam_av = ext->private_data;
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
if (arcam_av->port_fd >= 0)
|
|
Packit Service |
cd2a00 |
close(arcam_av->port_fd);
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
if (arcam_av->global)
|
|
Packit Service |
cd2a00 |
arcam_av_state_detach(arcam_av->global);
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
if (arcam_av->ext.poll_fd >= 0) {
|
|
Packit Service |
cd2a00 |
close(arcam_av->ext.poll_fd);
|
|
Packit Service |
cd2a00 |
arcam_av_server_stop(arcam_av->server, arcam_av->port);
|
|
Packit Service |
cd2a00 |
}
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
free(arcam_av);
|
|
Packit Service |
cd2a00 |
}
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
static int arcam_av_elem_count(snd_ctl_ext_t *ext)
|
|
Packit Service |
cd2a00 |
{
|
|
Packit Service |
cd2a00 |
snd_ctl_arcam_av_t *arcam_av = ext->private_data;
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
switch(arcam_av->zone) {
|
|
Packit Service |
cd2a00 |
case ARCAM_AV_ZONE1:
|
|
Packit Service |
cd2a00 |
return ARRAY_SIZE(arcam_av_zone1);
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
case ARCAM_AV_ZONE2:
|
|
Packit Service |
cd2a00 |
return ARRAY_SIZE(arcam_av_zone2);
|
|
Packit Service |
cd2a00 |
}
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
return 0;
|
|
Packit Service |
cd2a00 |
}
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
static int arcam_av_elem_list(snd_ctl_ext_t *ext, unsigned int offset, snd_ctl_elem_id_t *id)
|
|
Packit Service |
cd2a00 |
{
|
|
Packit Service |
cd2a00 |
snd_ctl_arcam_av_t *arcam_av = ext->private_data;
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
snd_ctl_elem_id_set_interface(id, SND_CTL_ELEM_IFACE_MIXER);
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
switch(arcam_av->zone) {
|
|
Packit Service |
cd2a00 |
case ARCAM_AV_ZONE1:
|
|
Packit Service |
cd2a00 |
if (offset < ARRAY_SIZE(arcam_av_zone1))
|
|
Packit Service |
cd2a00 |
snd_ctl_elem_id_set_name(id, arcam_av_zone1[offset].name);
|
|
Packit Service |
cd2a00 |
break;
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
case ARCAM_AV_ZONE2:
|
|
Packit Service |
cd2a00 |
if (offset < ARRAY_SIZE(arcam_av_zone2))
|
|
Packit Service |
cd2a00 |
snd_ctl_elem_id_set_name(id, arcam_av_zone2[offset].name);
|
|
Packit Service |
cd2a00 |
break;
|
|
Packit Service |
cd2a00 |
}
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
return 0;
|
|
Packit Service |
cd2a00 |
}
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
static snd_ctl_ext_key_t arcam_av_find_elem(snd_ctl_ext_t *ext,
|
|
Packit Service |
cd2a00 |
const snd_ctl_elem_id_t *id)
|
|
Packit Service |
cd2a00 |
{
|
|
Packit Service |
cd2a00 |
snd_ctl_arcam_av_t *arcam_av = ext->private_data;
|
|
Packit Service |
cd2a00 |
unsigned int numid, search;
|
|
Packit Service |
cd2a00 |
const char *name;
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
numid = snd_ctl_elem_id_get_numid(id);
|
|
Packit Service |
cd2a00 |
if (numid > 0) {
|
|
Packit Service |
cd2a00 |
numid--;
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
switch(arcam_av->zone) {
|
|
Packit Service |
cd2a00 |
case ARCAM_AV_ZONE1:
|
|
Packit Service |
cd2a00 |
if (numid < ARRAY_SIZE(arcam_av_zone1))
|
|
Packit Service |
cd2a00 |
return arcam_av_zone1[numid].code;
|
|
Packit Service |
cd2a00 |
break;
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
case ARCAM_AV_ZONE2:
|
|
Packit Service |
cd2a00 |
if (numid < ARRAY_SIZE(arcam_av_zone2))
|
|
Packit Service |
cd2a00 |
return arcam_av_zone2[numid].code;
|
|
Packit Service |
cd2a00 |
break;
|
|
Packit Service |
cd2a00 |
}
|
|
Packit Service |
cd2a00 |
}
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
name = snd_ctl_elem_id_get_name(id);
|
|
Packit Service |
cd2a00 |
switch(arcam_av->zone) {
|
|
Packit Service |
cd2a00 |
case ARCAM_AV_ZONE1:
|
|
Packit Service |
cd2a00 |
for (search = 0; search < ARRAY_SIZE(arcam_av_zone1); search++)
|
|
Packit Service |
cd2a00 |
if (!strcmp(name, arcam_av_zone1[search].name))
|
|
Packit Service |
cd2a00 |
return arcam_av_zone1[search].code;
|
|
Packit Service |
cd2a00 |
break;
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
case ARCAM_AV_ZONE2:
|
|
Packit Service |
cd2a00 |
for (search = 0; search < ARRAY_SIZE(arcam_av_zone2); search++)
|
|
Packit Service |
cd2a00 |
if (!strcmp(name, arcam_av_zone2[search].name))
|
|
Packit Service |
cd2a00 |
return arcam_av_zone2[search].code;
|
|
Packit Service |
cd2a00 |
break;
|
|
Packit Service |
cd2a00 |
}
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
return SND_CTL_EXT_KEY_NOT_FOUND;
|
|
Packit Service |
cd2a00 |
}
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
static int arcam_av_get_attribute(snd_ctl_ext_t *ext ATTRIBUTE_UNUSED,
|
|
Packit Service |
cd2a00 |
snd_ctl_ext_key_t key, int *type,
|
|
Packit Service |
cd2a00 |
unsigned int *acc, unsigned int *count)
|
|
Packit Service |
cd2a00 |
{
|
|
Packit Service |
cd2a00 |
switch(key) {
|
|
Packit Service |
cd2a00 |
case ARCAM_AV_POWER:
|
|
Packit Service |
cd2a00 |
*type = SND_CTL_ELEM_TYPE_BOOLEAN;
|
|
Packit Service |
cd2a00 |
*acc = SND_CTL_EXT_ACCESS_READWRITE;
|
|
Packit Service |
cd2a00 |
*count = 1;
|
|
Packit Service |
cd2a00 |
break;
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
case ARCAM_AV_VOLUME_SET:
|
|
Packit Service |
cd2a00 |
*type = SND_CTL_ELEM_TYPE_INTEGER;
|
|
Packit Service |
cd2a00 |
*acc = SND_CTL_EXT_ACCESS_READWRITE;
|
|
Packit Service |
cd2a00 |
*count = 1;
|
|
Packit Service |
cd2a00 |
break;
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
case ARCAM_AV_MUTE:
|
|
Packit Service |
cd2a00 |
*type = SND_CTL_ELEM_TYPE_BOOLEAN;
|
|
Packit Service |
cd2a00 |
*acc = SND_CTL_EXT_ACCESS_READWRITE;
|
|
Packit Service |
cd2a00 |
*count = 1;
|
|
Packit Service |
cd2a00 |
break;
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
case ARCAM_AV_DIRECT:
|
|
Packit Service |
cd2a00 |
*type = SND_CTL_ELEM_TYPE_ENUMERATED;
|
|
Packit Service |
cd2a00 |
*acc = SND_CTL_EXT_ACCESS_READWRITE;
|
|
Packit Service |
cd2a00 |
*count = 1;
|
|
Packit Service |
cd2a00 |
break;
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
case ARCAM_AV_SOURCE:
|
|
Packit Service |
cd2a00 |
*type = SND_CTL_ELEM_TYPE_ENUMERATED;
|
|
Packit Service |
cd2a00 |
*acc = SND_CTL_EXT_ACCESS_READWRITE;
|
|
Packit Service |
cd2a00 |
*count = 1;
|
|
Packit Service |
cd2a00 |
break;
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
case ARCAM_AV_SOURCE_TYPE:
|
|
Packit Service |
cd2a00 |
*type = SND_CTL_ELEM_TYPE_ENUMERATED;
|
|
Packit Service |
cd2a00 |
*acc = SND_CTL_EXT_ACCESS_READWRITE;
|
|
Packit Service |
cd2a00 |
*count = 1;
|
|
Packit Service |
cd2a00 |
break;
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
case ARCAM_AV_STEREO_DECODE:
|
|
Packit Service |
cd2a00 |
*type = SND_CTL_ELEM_TYPE_ENUMERATED;
|
|
Packit Service |
cd2a00 |
*acc = SND_CTL_EXT_ACCESS_READWRITE;
|
|
Packit Service |
cd2a00 |
*count = 1;
|
|
Packit Service |
cd2a00 |
break;
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
case ARCAM_AV_MULTI_DECODE:
|
|
Packit Service |
cd2a00 |
*type = SND_CTL_ELEM_TYPE_ENUMERATED;
|
|
Packit Service |
cd2a00 |
*acc = SND_CTL_EXT_ACCESS_READWRITE;
|
|
Packit Service |
cd2a00 |
*count = 1;
|
|
Packit Service |
cd2a00 |
break;
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
case ARCAM_AV_STEREO_EFFECT:
|
|
Packit Service |
cd2a00 |
*type = SND_CTL_ELEM_TYPE_ENUMERATED;
|
|
Packit Service |
cd2a00 |
*acc = SND_CTL_EXT_ACCESS_READWRITE;
|
|
Packit Service |
cd2a00 |
*count = 1;
|
|
Packit Service |
cd2a00 |
break;
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
default:
|
|
Packit Service |
cd2a00 |
return -EINVAL;
|
|
Packit Service |
cd2a00 |
}
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
return 0;
|
|
Packit Service |
cd2a00 |
}
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
static int arcam_av_get_integer_info(snd_ctl_ext_t *ext,
|
|
Packit Service |
cd2a00 |
snd_ctl_ext_key_t key,
|
|
Packit Service |
cd2a00 |
long *imin, long *imax, long *istep)
|
|
Packit Service |
cd2a00 |
{
|
|
Packit Service |
cd2a00 |
snd_ctl_arcam_av_t *arcam_av = ext->private_data;
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
switch(key) {
|
|
Packit Service |
cd2a00 |
case ARCAM_AV_VOLUME_SET:
|
|
Packit Service |
cd2a00 |
*istep = 1;
|
|
Packit Service |
cd2a00 |
switch(arcam_av->zone) {
|
|
Packit Service |
cd2a00 |
case ARCAM_AV_ZONE1:
|
|
Packit Service |
cd2a00 |
*imin = 0;
|
|
Packit Service |
cd2a00 |
*imax = 100;
|
|
Packit Service |
cd2a00 |
break;
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
case ARCAM_AV_ZONE2:
|
|
Packit Service |
cd2a00 |
*imin = 20;
|
|
Packit Service |
cd2a00 |
*imax = 83;
|
|
Packit Service |
cd2a00 |
break;
|
|
Packit Service |
cd2a00 |
}
|
|
Packit Service |
cd2a00 |
break;
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
default:
|
|
Packit Service |
cd2a00 |
return -EINVAL;
|
|
Packit Service |
cd2a00 |
}
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
return 0;
|
|
Packit Service |
cd2a00 |
}
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
static int arcam_av_get_enumerated_info(snd_ctl_ext_t *ext ATTRIBUTE_UNUSED,
|
|
Packit Service |
cd2a00 |
snd_ctl_ext_key_t key,
|
|
Packit Service |
cd2a00 |
unsigned int *items)
|
|
Packit Service |
cd2a00 |
{
|
|
Packit Service |
cd2a00 |
switch(key) {
|
|
Packit Service |
cd2a00 |
case ARCAM_AV_SOURCE:
|
|
Packit Service |
cd2a00 |
*items = ARRAY_SIZE(arcam_av_sources);
|
|
Packit Service |
cd2a00 |
break;
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
case ARCAM_AV_SOURCE_TYPE:
|
|
Packit Service |
cd2a00 |
*items = ARRAY_SIZE(arcam_av_source_types);
|
|
Packit Service |
cd2a00 |
break;
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
case ARCAM_AV_DIRECT:
|
|
Packit Service |
cd2a00 |
*items = ARRAY_SIZE(arcam_av_direct);
|
|
Packit Service |
cd2a00 |
break;
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
case ARCAM_AV_STEREO_DECODE:
|
|
Packit Service |
cd2a00 |
*items = ARRAY_SIZE(arcam_av_stereo_decode_modes);
|
|
Packit Service |
cd2a00 |
break;
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
case ARCAM_AV_MULTI_DECODE:
|
|
Packit Service |
cd2a00 |
*items = ARRAY_SIZE(arcam_av_multi_decode_modes);
|
|
Packit Service |
cd2a00 |
break;
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
case ARCAM_AV_STEREO_EFFECT:
|
|
Packit Service |
cd2a00 |
*items = ARRAY_SIZE(arcam_av_stereo_effects);
|
|
Packit Service |
cd2a00 |
break;
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
default:
|
|
Packit Service |
cd2a00 |
return -EINVAL;
|
|
Packit Service |
cd2a00 |
}
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
return 0;
|
|
Packit Service |
cd2a00 |
}
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
static int arcam_av_get_enumerated_name(snd_ctl_ext_t *ext ATTRIBUTE_UNUSED,
|
|
Packit Service |
cd2a00 |
snd_ctl_ext_key_t key,
|
|
Packit Service |
cd2a00 |
unsigned int item, char *name,
|
|
Packit Service |
cd2a00 |
size_t name_max_len)
|
|
Packit Service |
cd2a00 |
{
|
|
Packit Service |
cd2a00 |
const char* label;
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
switch(key) {
|
|
Packit Service |
cd2a00 |
case ARCAM_AV_SOURCE:
|
|
Packit Service |
cd2a00 |
if (item >= ARRAY_SIZE(arcam_av_sources))
|
|
Packit Service |
cd2a00 |
return -EINVAL;
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
label = arcam_av_sources[item].name;
|
|
Packit Service |
cd2a00 |
break;
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
case ARCAM_AV_SOURCE_TYPE:
|
|
Packit Service |
cd2a00 |
if (item >= ARRAY_SIZE(arcam_av_source_types))
|
|
Packit Service |
cd2a00 |
return -EINVAL;
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
label = arcam_av_source_types[item].name;
|
|
Packit Service |
cd2a00 |
break;
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
case ARCAM_AV_DIRECT:
|
|
Packit Service |
cd2a00 |
if (item >= ARRAY_SIZE(arcam_av_direct))
|
|
Packit Service |
cd2a00 |
return -EINVAL;
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
label = arcam_av_direct[item].name;
|
|
Packit Service |
cd2a00 |
break;
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
case ARCAM_AV_STEREO_DECODE:
|
|
Packit Service |
cd2a00 |
if (item >= ARRAY_SIZE(arcam_av_stereo_decode_modes))
|
|
Packit Service |
cd2a00 |
return -EINVAL;
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
label = arcam_av_stereo_decode_modes[item].name;
|
|
Packit Service |
cd2a00 |
break;
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
case ARCAM_AV_MULTI_DECODE:
|
|
Packit Service |
cd2a00 |
if (item >= ARRAY_SIZE(arcam_av_multi_decode_modes))
|
|
Packit Service |
cd2a00 |
return -EINVAL;
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
label = arcam_av_multi_decode_modes[item].name;
|
|
Packit Service |
cd2a00 |
break;
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
case ARCAM_AV_STEREO_EFFECT:
|
|
Packit Service |
cd2a00 |
if (item >= ARRAY_SIZE(arcam_av_stereo_effects))
|
|
Packit Service |
cd2a00 |
return -EINVAL;
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
label = arcam_av_stereo_effects[item].name;
|
|
Packit Service |
cd2a00 |
break;
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
default:
|
|
Packit Service |
cd2a00 |
return -EINVAL;
|
|
Packit Service |
cd2a00 |
}
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
strncpy(name, label, name_max_len - 1);
|
|
Packit Service |
cd2a00 |
name[name_max_len - 1] = '\0';
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
return 0;
|
|
Packit Service |
cd2a00 |
}
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
static int arcam_av_read_integer(snd_ctl_ext_t *ext, snd_ctl_ext_key_t key, long *value)
|
|
Packit Service |
cd2a00 |
{
|
|
Packit Service |
cd2a00 |
snd_ctl_arcam_av_t *arcam_av = ext->private_data;
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
switch(key) {
|
|
Packit Service |
cd2a00 |
case ARCAM_AV_POWER:
|
|
Packit Service |
cd2a00 |
switch(arcam_av->zone) {
|
|
Packit Service |
cd2a00 |
case ARCAM_AV_ZONE1:
|
|
Packit Service |
cd2a00 |
arcam_av->local.zone1.power = arcam_av->global->zone1.power;
|
|
Packit Service |
cd2a00 |
*value = !(arcam_av->local.zone1.power == ARCAM_AV_POWER_STAND_BY);
|
|
Packit Service |
cd2a00 |
break;
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
case ARCAM_AV_ZONE2:
|
|
Packit Service |
cd2a00 |
arcam_av->local.zone2.power = arcam_av->global->zone2.power;
|
|
Packit Service |
cd2a00 |
*value = !(arcam_av->local.zone2.power == ARCAM_AV_POWER_STAND_BY);
|
|
Packit Service |
cd2a00 |
break;
|
|
Packit Service |
cd2a00 |
}
|
|
Packit Service |
cd2a00 |
break;
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
case ARCAM_AV_VOLUME_SET:
|
|
Packit Service |
cd2a00 |
switch(arcam_av->zone) {
|
|
Packit Service |
cd2a00 |
case ARCAM_AV_ZONE1:
|
|
Packit Service |
cd2a00 |
arcam_av->local.zone1.volume = arcam_av->global->zone1.volume;
|
|
Packit Service |
cd2a00 |
*value = MID(0, arcam_av->local.zone1.volume - ARCAM_AV_VOLUME_MIN, 100);
|
|
Packit Service |
cd2a00 |
break;
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
case ARCAM_AV_ZONE2:
|
|
Packit Service |
cd2a00 |
arcam_av->local.zone2.volume = arcam_av->global->zone2.volume;
|
|
Packit Service |
cd2a00 |
*value = MID(20, arcam_av->local.zone2.volume - ARCAM_AV_VOLUME_MIN, 83);
|
|
Packit Service |
cd2a00 |
break;
|
|
Packit Service |
cd2a00 |
}
|
|
Packit Service |
cd2a00 |
break;
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
case ARCAM_AV_MUTE:
|
|
Packit Service |
cd2a00 |
switch(arcam_av->zone) {
|
|
Packit Service |
cd2a00 |
case ARCAM_AV_ZONE1:
|
|
Packit Service |
cd2a00 |
arcam_av->local.zone1.mute = arcam_av->global->zone1.mute;
|
|
Packit Service |
cd2a00 |
*value = !(arcam_av->local.zone1.mute == ARCAM_AV_MUTE_ON);
|
|
Packit Service |
cd2a00 |
break;
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
case ARCAM_AV_ZONE2:
|
|
Packit Service |
cd2a00 |
arcam_av->local.zone2.mute = arcam_av->global->zone2.mute;
|
|
Packit Service |
cd2a00 |
*value = !(arcam_av->local.zone2.mute == ARCAM_AV_MUTE_ON);
|
|
Packit Service |
cd2a00 |
break;
|
|
Packit Service |
cd2a00 |
}
|
|
Packit Service |
cd2a00 |
break;
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
default:
|
|
Packit Service |
cd2a00 |
return -EINVAL;
|
|
Packit Service |
cd2a00 |
}
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
return 0;
|
|
Packit Service |
cd2a00 |
}
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
static int arcam_av_read_enumerated(snd_ctl_ext_t *ext,
|
|
Packit Service |
cd2a00 |
snd_ctl_ext_key_t key,
|
|
Packit Service |
cd2a00 |
unsigned int *item)
|
|
Packit Service |
cd2a00 |
{
|
|
Packit Service |
cd2a00 |
snd_ctl_arcam_av_t *arcam_av = ext->private_data;
|
|
Packit Service |
cd2a00 |
unsigned int i;
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
switch(key) {
|
|
Packit Service |
cd2a00 |
case ARCAM_AV_SOURCE:
|
|
Packit Service |
cd2a00 |
switch(arcam_av->zone) {
|
|
Packit Service |
cd2a00 |
case ARCAM_AV_ZONE1:
|
|
Packit Service |
cd2a00 |
arcam_av->local.zone1.source = arcam_av->global->zone1.source;
|
|
Packit Service |
cd2a00 |
for (i = 0; i < ARRAY_SIZE(arcam_av_sources); ++i) {
|
|
Packit Service |
cd2a00 |
if (arcam_av_sources[i].code == arcam_av->local.zone1.source) {
|
|
Packit Service |
cd2a00 |
*item = i;
|
|
Packit Service |
cd2a00 |
break;
|
|
Packit Service |
cd2a00 |
}
|
|
Packit Service |
cd2a00 |
}
|
|
Packit Service |
cd2a00 |
break;
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
case ARCAM_AV_ZONE2:
|
|
Packit Service |
cd2a00 |
arcam_av->local.zone2.source = arcam_av->global->zone2.source;
|
|
Packit Service |
cd2a00 |
for (i = 0; i < ARRAY_SIZE(arcam_av_sources); ++i) {
|
|
Packit Service |
cd2a00 |
if (arcam_av_sources[i].code == arcam_av->local.zone2.source) {
|
|
Packit Service |
cd2a00 |
*item = i;
|
|
Packit Service |
cd2a00 |
break;
|
|
Packit Service |
cd2a00 |
}
|
|
Packit Service |
cd2a00 |
}
|
|
Packit Service |
cd2a00 |
break;
|
|
Packit Service |
cd2a00 |
}
|
|
Packit Service |
cd2a00 |
break;
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
case ARCAM_AV_SOURCE_TYPE:
|
|
Packit Service |
cd2a00 |
switch(arcam_av->zone) {
|
|
Packit Service |
cd2a00 |
case ARCAM_AV_ZONE1:
|
|
Packit Service |
cd2a00 |
arcam_av->local.zone1.source_type = arcam_av->global->zone1.source_type;
|
|
Packit Service |
cd2a00 |
for (i = 0; i < ARRAY_SIZE(arcam_av_source_types); ++i) {
|
|
Packit Service |
cd2a00 |
if (arcam_av_source_types[i].code == arcam_av->local.zone1.source_type) {
|
|
Packit Service |
cd2a00 |
*item = i;
|
|
Packit Service |
cd2a00 |
break;
|
|
Packit Service |
cd2a00 |
}
|
|
Packit Service |
cd2a00 |
}
|
|
Packit Service |
cd2a00 |
break;
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
case ARCAM_AV_ZONE2:
|
|
Packit Service |
cd2a00 |
return -EINVAL;
|
|
Packit Service |
cd2a00 |
}
|
|
Packit Service |
cd2a00 |
break;
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
case ARCAM_AV_DIRECT:
|
|
Packit Service |
cd2a00 |
switch(arcam_av->zone) {
|
|
Packit Service |
cd2a00 |
case ARCAM_AV_ZONE1:
|
|
Packit Service |
cd2a00 |
arcam_av->local.zone1.direct = arcam_av->global->zone1.direct;
|
|
Packit Service |
cd2a00 |
for (i = 0; i < ARRAY_SIZE(arcam_av_direct); ++i) {
|
|
Packit Service |
cd2a00 |
if (arcam_av_direct[i].code == arcam_av->local.zone1.direct) {
|
|
Packit Service |
cd2a00 |
*item = i;
|
|
Packit Service |
cd2a00 |
break;
|
|
Packit Service |
cd2a00 |
}
|
|
Packit Service |
cd2a00 |
}
|
|
Packit Service |
cd2a00 |
break;
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
case ARCAM_AV_ZONE2:
|
|
Packit Service |
cd2a00 |
return -EINVAL;
|
|
Packit Service |
cd2a00 |
}
|
|
Packit Service |
cd2a00 |
break;
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
case ARCAM_AV_STEREO_DECODE:
|
|
Packit Service |
cd2a00 |
switch(arcam_av->zone) {
|
|
Packit Service |
cd2a00 |
case ARCAM_AV_ZONE1:
|
|
Packit Service |
cd2a00 |
arcam_av->local.zone1.stereo_decode = arcam_av->global->zone1.stereo_decode;
|
|
Packit Service |
cd2a00 |
for (i = 0; i < ARRAY_SIZE(arcam_av_stereo_decode_modes); ++i) {
|
|
Packit Service |
cd2a00 |
if (arcam_av_stereo_decode_modes[i].code == arcam_av->local.zone1.stereo_decode) {
|
|
Packit Service |
cd2a00 |
*item = i;
|
|
Packit Service |
cd2a00 |
break;
|
|
Packit Service |
cd2a00 |
}
|
|
Packit Service |
cd2a00 |
}
|
|
Packit Service |
cd2a00 |
break;
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
case ARCAM_AV_ZONE2:
|
|
Packit Service |
cd2a00 |
return -EINVAL;
|
|
Packit Service |
cd2a00 |
}
|
|
Packit Service |
cd2a00 |
break;
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
case ARCAM_AV_STEREO_EFFECT:
|
|
Packit Service |
cd2a00 |
switch(arcam_av->zone) {
|
|
Packit Service |
cd2a00 |
case ARCAM_AV_ZONE1:
|
|
Packit Service |
cd2a00 |
arcam_av->local.zone1.stereo_effect = arcam_av->global->zone1.stereo_effect;
|
|
Packit Service |
cd2a00 |
for (i = 0; i < ARRAY_SIZE(arcam_av_stereo_effects); ++i) {
|
|
Packit Service |
cd2a00 |
if (arcam_av_stereo_effects[i].code == arcam_av->local.zone1.stereo_effect) {
|
|
Packit Service |
cd2a00 |
*item = i;
|
|
Packit Service |
cd2a00 |
break;
|
|
Packit Service |
cd2a00 |
}
|
|
Packit Service |
cd2a00 |
}
|
|
Packit Service |
cd2a00 |
break;
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
case ARCAM_AV_ZONE2:
|
|
Packit Service |
cd2a00 |
return -EINVAL;
|
|
Packit Service |
cd2a00 |
}
|
|
Packit Service |
cd2a00 |
break;
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
case ARCAM_AV_MULTI_DECODE:
|
|
Packit Service |
cd2a00 |
switch(arcam_av->zone) {
|
|
Packit Service |
cd2a00 |
case ARCAM_AV_ZONE1:
|
|
Packit Service |
cd2a00 |
arcam_av->local.zone1.multi_decode = arcam_av->global->zone1.multi_decode;
|
|
Packit Service |
cd2a00 |
for (i = 0; i < ARRAY_SIZE(arcam_av_multi_decode_modes); ++i) {
|
|
Packit Service |
cd2a00 |
if (arcam_av_multi_decode_modes[i].code == arcam_av->local.zone1.multi_decode) {
|
|
Packit Service |
cd2a00 |
*item = i;
|
|
Packit Service |
cd2a00 |
break;
|
|
Packit Service |
cd2a00 |
}
|
|
Packit Service |
cd2a00 |
}
|
|
Packit Service |
cd2a00 |
break;
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
case ARCAM_AV_ZONE2:
|
|
Packit Service |
cd2a00 |
return -EINVAL;
|
|
Packit Service |
cd2a00 |
}
|
|
Packit Service |
cd2a00 |
break;
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
default:
|
|
Packit Service |
cd2a00 |
return -EINVAL;
|
|
Packit Service |
cd2a00 |
}
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
return 0;
|
|
Packit Service |
cd2a00 |
}
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
static int arcam_av_write_integer(snd_ctl_ext_t *ext, snd_ctl_ext_key_t key, long *value)
|
|
Packit Service |
cd2a00 |
{
|
|
Packit Service |
cd2a00 |
snd_ctl_arcam_av_t *arcam_av = ext->private_data;
|
|
Packit Service |
cd2a00 |
unsigned char volume = ARCAM_AV_VOLUME_MIN;
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
switch(key) {
|
|
Packit Service |
cd2a00 |
case ARCAM_AV_POWER:
|
|
Packit Service |
cd2a00 |
switch(arcam_av->zone) {
|
|
Packit Service |
cd2a00 |
case ARCAM_AV_ZONE1:
|
|
Packit Service |
cd2a00 |
arcam_av->local.zone1.power = ARCAM_AV_POWER_STAND_BY + *value;
|
|
Packit Service |
cd2a00 |
if (arcam_av->global->zone1.power == arcam_av->local.zone1.power)
|
|
Packit Service |
cd2a00 |
return 0;
|
|
Packit Service |
cd2a00 |
break;
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
case ARCAM_AV_ZONE2:
|
|
Packit Service |
cd2a00 |
arcam_av->local.zone2.power = ARCAM_AV_POWER_STAND_BY + *value;
|
|
Packit Service |
cd2a00 |
if (arcam_av->global->zone2.power == arcam_av->local.zone2.power)
|
|
Packit Service |
cd2a00 |
return 0;
|
|
Packit Service |
cd2a00 |
break;
|
|
Packit Service |
cd2a00 |
}
|
|
Packit Service |
cd2a00 |
break;
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
case ARCAM_AV_VOLUME_SET:
|
|
Packit Service |
cd2a00 |
switch(arcam_av->zone) {
|
|
Packit Service |
cd2a00 |
case ARCAM_AV_ZONE1:
|
|
Packit Service |
cd2a00 |
arcam_av->local.zone1.volume = ARCAM_AV_VOLUME_MIN + *value;
|
|
Packit Service |
cd2a00 |
if (arcam_av->global->zone1.volume == arcam_av->local.zone1.volume)
|
|
Packit Service |
cd2a00 |
return 0;
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
if (arcam_av->global->zone1.mute == ARCAM_AV_MUTE_ON) {
|
|
Packit Service |
cd2a00 |
arcam_av->global->zone1.volume = arcam_av->local.zone1.volume;
|
|
Packit Service |
cd2a00 |
return 1;
|
|
Packit Service |
cd2a00 |
}
|
|
Packit Service |
cd2a00 |
break;
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
case ARCAM_AV_ZONE2:
|
|
Packit Service |
cd2a00 |
arcam_av->local.zone2.volume = ARCAM_AV_VOLUME_MIN + *value;
|
|
Packit Service |
cd2a00 |
if (arcam_av->global->zone2.volume == arcam_av->local.zone2.volume)
|
|
Packit Service |
cd2a00 |
return 0;
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
if (arcam_av->global->zone2.mute == ARCAM_AV_MUTE_ON) {
|
|
Packit Service |
cd2a00 |
arcam_av->global->zone2.volume = arcam_av->local.zone2.volume;
|
|
Packit Service |
cd2a00 |
return 1;
|
|
Packit Service |
cd2a00 |
}
|
|
Packit Service |
cd2a00 |
break;
|
|
Packit Service |
cd2a00 |
}
|
|
Packit Service |
cd2a00 |
break;
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
case ARCAM_AV_MUTE:
|
|
Packit Service |
cd2a00 |
switch(arcam_av->zone) {
|
|
Packit Service |
cd2a00 |
case ARCAM_AV_ZONE1:
|
|
Packit Service |
cd2a00 |
arcam_av->local.zone1.mute = ARCAM_AV_MUTE_ON + *value;
|
|
Packit Service |
cd2a00 |
if (arcam_av->global->zone1.mute == arcam_av->local.zone1.mute)
|
|
Packit Service |
cd2a00 |
return 0;
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
volume = arcam_av->global->zone1.volume;
|
|
Packit Service |
cd2a00 |
break;
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
case ARCAM_AV_ZONE2:
|
|
Packit Service |
cd2a00 |
arcam_av->local.zone2.mute = ARCAM_AV_MUTE_ON + *value;
|
|
Packit Service |
cd2a00 |
if (arcam_av->global->zone2.mute == arcam_av->local.zone2.mute)
|
|
Packit Service |
cd2a00 |
return 0;
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
volume = arcam_av->global->zone2.volume;
|
|
Packit Service |
cd2a00 |
break;
|
|
Packit Service |
cd2a00 |
}
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
if (*value)
|
|
Packit Service |
cd2a00 |
arcam_av_send(arcam_av->port_fd, ARCAM_AV_VOLUME_SET, arcam_av->zone, volume);
|
|
Packit Service |
cd2a00 |
break;
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
default:
|
|
Packit Service |
cd2a00 |
return -EINVAL;
|
|
Packit Service |
cd2a00 |
}
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
if (!arcam_av_send(arcam_av->port_fd, key, arcam_av->zone, '0' + *value))
|
|
Packit Service |
cd2a00 |
return 1;
|
|
Packit Service |
cd2a00 |
else
|
|
Packit Service |
cd2a00 |
return -1;
|
|
Packit Service |
cd2a00 |
}
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
static int arcam_av_write_enumerated(snd_ctl_ext_t *ext, snd_ctl_ext_key_t key, unsigned int *item)
|
|
Packit Service |
cd2a00 |
{
|
|
Packit Service |
cd2a00 |
snd_ctl_arcam_av_t *arcam_av = ext->private_data;
|
|
Packit Service |
cd2a00 |
unsigned char code;
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
switch(key) {
|
|
Packit Service |
cd2a00 |
case ARCAM_AV_SOURCE:
|
|
Packit Service |
cd2a00 |
if (*item >= ARRAY_SIZE(arcam_av_sources))
|
|
Packit Service |
cd2a00 |
return -EINVAL;
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
code = arcam_av_sources[*item].code;
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
switch(arcam_av->zone) {
|
|
Packit Service |
cd2a00 |
case ARCAM_AV_ZONE1:
|
|
Packit Service |
cd2a00 |
arcam_av->local.zone1.source = code;
|
|
Packit Service |
cd2a00 |
if (arcam_av->global->zone1.source == code)
|
|
Packit Service |
cd2a00 |
return 0;
|
|
Packit Service |
cd2a00 |
break;
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
case ARCAM_AV_ZONE2:
|
|
Packit Service |
cd2a00 |
arcam_av->local.zone2.source = code;
|
|
Packit Service |
cd2a00 |
if (arcam_av->global->zone2.source == code)
|
|
Packit Service |
cd2a00 |
return 0;
|
|
Packit Service |
cd2a00 |
break;
|
|
Packit Service |
cd2a00 |
}
|
|
Packit Service |
cd2a00 |
break;
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
case ARCAM_AV_SOURCE_TYPE:
|
|
Packit Service |
cd2a00 |
if (*item >= ARRAY_SIZE(arcam_av_source_types))
|
|
Packit Service |
cd2a00 |
return -EINVAL;
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
code = arcam_av_source_types[*item].code;
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
switch(arcam_av->zone) {
|
|
Packit Service |
cd2a00 |
case ARCAM_AV_ZONE1:
|
|
Packit Service |
cd2a00 |
arcam_av->local.zone1.source_type = code;
|
|
Packit Service |
cd2a00 |
if (arcam_av->global->zone1.source_type == code)
|
|
Packit Service |
cd2a00 |
return 0;
|
|
Packit Service |
cd2a00 |
break;
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
case ARCAM_AV_ZONE2:
|
|
Packit Service |
cd2a00 |
return -EINVAL;
|
|
Packit Service |
cd2a00 |
}
|
|
Packit Service |
cd2a00 |
break;
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
case ARCAM_AV_DIRECT:
|
|
Packit Service |
cd2a00 |
if (*item >= ARRAY_SIZE(arcam_av_direct))
|
|
Packit Service |
cd2a00 |
return -EINVAL;
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
code = arcam_av_direct[*item].code;
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
switch(arcam_av->zone) {
|
|
Packit Service |
cd2a00 |
case ARCAM_AV_ZONE1:
|
|
Packit Service |
cd2a00 |
arcam_av->local.zone1.direct = code;
|
|
Packit Service |
cd2a00 |
if (arcam_av->global->zone1.direct == code)
|
|
Packit Service |
cd2a00 |
return 0;
|
|
Packit Service |
cd2a00 |
break;
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
case ARCAM_AV_ZONE2:
|
|
Packit Service |
cd2a00 |
return -EINVAL;
|
|
Packit Service |
cd2a00 |
}
|
|
Packit Service |
cd2a00 |
break;
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
case ARCAM_AV_STEREO_DECODE:
|
|
Packit Service |
cd2a00 |
if (*item >= ARRAY_SIZE(arcam_av_stereo_decode_modes))
|
|
Packit Service |
cd2a00 |
return -EINVAL;
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
code = arcam_av_stereo_decode_modes[*item].code;
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
switch(arcam_av->zone) {
|
|
Packit Service |
cd2a00 |
case ARCAM_AV_ZONE1:
|
|
Packit Service |
cd2a00 |
arcam_av->local.zone1.stereo_decode = code;
|
|
Packit Service |
cd2a00 |
if (arcam_av->global->zone1.stereo_decode == code)
|
|
Packit Service |
cd2a00 |
return 0;
|
|
Packit Service |
cd2a00 |
break;
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
case ARCAM_AV_ZONE2:
|
|
Packit Service |
cd2a00 |
return -EINVAL;
|
|
Packit Service |
cd2a00 |
}
|
|
Packit Service |
cd2a00 |
break;
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
case ARCAM_AV_STEREO_EFFECT:
|
|
Packit Service |
cd2a00 |
if (*item >= ARRAY_SIZE(arcam_av_stereo_effects))
|
|
Packit Service |
cd2a00 |
return -EINVAL;
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
code = arcam_av_stereo_effects[*item].code;
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
switch(arcam_av->zone) {
|
|
Packit Service |
cd2a00 |
case ARCAM_AV_ZONE1:
|
|
Packit Service |
cd2a00 |
arcam_av->local.zone1.stereo_effect = code;
|
|
Packit Service |
cd2a00 |
if (arcam_av->global->zone1.stereo_effect == code)
|
|
Packit Service |
cd2a00 |
return 0;
|
|
Packit Service |
cd2a00 |
break;
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
case ARCAM_AV_ZONE2:
|
|
Packit Service |
cd2a00 |
return -EINVAL;
|
|
Packit Service |
cd2a00 |
}
|
|
Packit Service |
cd2a00 |
break;
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
case ARCAM_AV_MULTI_DECODE:
|
|
Packit Service |
cd2a00 |
if (*item >= ARRAY_SIZE(arcam_av_multi_decode_modes))
|
|
Packit Service |
cd2a00 |
return -EINVAL;
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
code = arcam_av_multi_decode_modes[*item].code;
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
switch(arcam_av->zone) {
|
|
Packit Service |
cd2a00 |
case ARCAM_AV_ZONE1:
|
|
Packit Service |
cd2a00 |
arcam_av->local.zone1.multi_decode = code;
|
|
Packit Service |
cd2a00 |
if (arcam_av->global->zone1.multi_decode == code)
|
|
Packit Service |
cd2a00 |
return 0;
|
|
Packit Service |
cd2a00 |
break;
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
case ARCAM_AV_ZONE2:
|
|
Packit Service |
cd2a00 |
return -EINVAL;
|
|
Packit Service |
cd2a00 |
}
|
|
Packit Service |
cd2a00 |
break;
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
default:
|
|
Packit Service |
cd2a00 |
return -EINVAL;
|
|
Packit Service |
cd2a00 |
}
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
if (!arcam_av_send(arcam_av->port_fd, key, arcam_av->zone, code))
|
|
Packit Service |
cd2a00 |
return 1;
|
|
Packit Service |
cd2a00 |
else
|
|
Packit Service |
cd2a00 |
return -1;
|
|
Packit Service |
cd2a00 |
}
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
static int arcam_av_read_event(snd_ctl_ext_t *ext, snd_ctl_elem_id_t *id, unsigned int *event_mask)
|
|
Packit Service |
cd2a00 |
{
|
|
Packit Service |
cd2a00 |
snd_ctl_arcam_av_t *arcam_av = ext->private_data;
|
|
Packit Service |
cd2a00 |
unsigned int elem;
|
|
Packit Service |
cd2a00 |
int result = 0;
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
switch(arcam_av->zone) {
|
|
Packit Service |
cd2a00 |
case ARCAM_AV_ZONE1:
|
|
Packit Service |
cd2a00 |
for (elem = 0; elem < ARRAY_SIZE(arcam_av_zone1); ++elem) {
|
|
Packit Service |
cd2a00 |
if (arcam_av->local.zone1.state[elem] != arcam_av->global->zone1.state[elem]) {
|
|
Packit Service |
cd2a00 |
snd_ctl_elem_id_set_name(id, arcam_av_zone1[elem].name);
|
|
Packit Service |
cd2a00 |
snd_ctl_elem_id_set_numid(id, elem + 1);
|
|
Packit Service |
cd2a00 |
arcam_av->local.zone1.state[elem] = arcam_av->global->zone1.state[elem];
|
|
Packit Service |
cd2a00 |
result = 1;
|
|
Packit Service |
cd2a00 |
break;
|
|
Packit Service |
cd2a00 |
}
|
|
Packit Service |
cd2a00 |
}
|
|
Packit Service |
cd2a00 |
break;
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
case ARCAM_AV_ZONE2:
|
|
Packit Service |
cd2a00 |
for (elem = 0; elem < ARRAY_SIZE(arcam_av_zone2); ++elem) {
|
|
Packit Service |
cd2a00 |
if (arcam_av->local.zone2.state[elem] != arcam_av->global->zone2.state[elem]) {
|
|
Packit Service |
cd2a00 |
snd_ctl_elem_id_set_name(id, arcam_av_zone2[elem].name);
|
|
Packit Service |
cd2a00 |
snd_ctl_elem_id_set_numid(id, elem + 1);
|
|
Packit Service |
cd2a00 |
arcam_av->local.zone2.state[elem] = arcam_av->global->zone2.state[elem];
|
|
Packit Service |
cd2a00 |
result = 1;
|
|
Packit Service |
cd2a00 |
break;
|
|
Packit Service |
cd2a00 |
}
|
|
Packit Service |
cd2a00 |
}
|
|
Packit Service |
cd2a00 |
break;
|
|
Packit Service |
cd2a00 |
}
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
if (!result) {
|
|
Packit Service |
cd2a00 |
char buf[10];
|
|
Packit Service |
cd2a00 |
if (recv(arcam_av->ext.poll_fd, buf, sizeof(buf), 0) <= 0) {
|
|
Packit Service |
cd2a00 |
close(arcam_av->ext.poll_fd);
|
|
Packit Service |
cd2a00 |
arcam_av->ext.poll_fd = arcam_av_client(arcam_av->port);
|
|
Packit Service |
cd2a00 |
if (arcam_av->ext.poll_fd > 0)
|
|
Packit Service |
cd2a00 |
fcntl(arcam_av->ext.poll_fd, F_SETFL, O_NONBLOCK);
|
|
Packit Service |
cd2a00 |
}
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
result = -EAGAIN;
|
|
Packit Service |
cd2a00 |
} else {
|
|
Packit Service |
cd2a00 |
snd_ctl_elem_id_set_interface(id, SND_CTL_ELEM_IFACE_MIXER);
|
|
Packit Service |
cd2a00 |
*event_mask = SND_CTL_EVENT_MASK_VALUE;
|
|
Packit Service |
cd2a00 |
}
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
return result;
|
|
Packit Service |
cd2a00 |
}
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
static snd_ctl_ext_callback_t arcam_av_ext_callback = {
|
|
Packit Service |
cd2a00 |
.close = arcam_av_close,
|
|
Packit Service |
cd2a00 |
.elem_count = arcam_av_elem_count,
|
|
Packit Service |
cd2a00 |
.elem_list = arcam_av_elem_list,
|
|
Packit Service |
cd2a00 |
.find_elem = arcam_av_find_elem,
|
|
Packit Service |
cd2a00 |
.get_attribute = arcam_av_get_attribute,
|
|
Packit Service |
cd2a00 |
.get_integer_info = arcam_av_get_integer_info,
|
|
Packit Service |
cd2a00 |
.get_enumerated_info = arcam_av_get_enumerated_info,
|
|
Packit Service |
cd2a00 |
.get_enumerated_name = arcam_av_get_enumerated_name,
|
|
Packit Service |
cd2a00 |
.read_integer = arcam_av_read_integer,
|
|
Packit Service |
cd2a00 |
.read_enumerated = arcam_av_read_enumerated,
|
|
Packit Service |
cd2a00 |
.write_integer = arcam_av_write_integer,
|
|
Packit Service |
cd2a00 |
.write_enumerated = arcam_av_write_enumerated,
|
|
Packit Service |
cd2a00 |
.read_event = arcam_av_read_event,
|
|
Packit Service |
cd2a00 |
};
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
SND_CTL_PLUGIN_DEFINE_FUNC(arcam_av)
|
|
Packit Service |
cd2a00 |
{
|
|
Packit Service |
cd2a00 |
snd_config_iterator_t it, next;
|
|
Packit Service |
cd2a00 |
const char *port = "/dev/ttyS0";
|
|
Packit Service |
cd2a00 |
long zone = 1;
|
|
Packit Service |
cd2a00 |
int err;
|
|
Packit Service |
cd2a00 |
snd_ctl_arcam_av_t *arcam_av = NULL;
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
snd_config_for_each(it, next, conf) {
|
|
Packit Service |
cd2a00 |
snd_config_t *n = snd_config_iterator_entry(it);
|
|
Packit Service |
cd2a00 |
const char *id;
|
|
Packit Service |
cd2a00 |
if (snd_config_get_id(n, &id) < 0)
|
|
Packit Service |
cd2a00 |
continue;
|
|
Packit Service |
cd2a00 |
if (strcmp(id, "comment") == 0 || strcmp(id, "type") == 0 || strcmp(id, "hint") == 0)
|
|
Packit Service |
cd2a00 |
continue;
|
|
Packit Service |
cd2a00 |
if (strcmp(id, "port") == 0) {
|
|
Packit Service |
cd2a00 |
if (snd_config_get_string(n, &port) < 0) {
|
|
Packit Service |
cd2a00 |
SNDERR("Invalid type for %s", id);
|
|
Packit Service |
cd2a00 |
return -EINVAL;
|
|
Packit Service |
cd2a00 |
}
|
|
Packit Service |
cd2a00 |
continue;
|
|
Packit Service |
cd2a00 |
}
|
|
Packit Service |
cd2a00 |
if (strcmp(id, "zone") == 0) {
|
|
Packit Service |
cd2a00 |
if (snd_config_get_integer(n, &zone) < 0) {
|
|
Packit Service |
cd2a00 |
SNDERR("Invalid type for %s", id);
|
|
Packit Service |
cd2a00 |
return -EINVAL;
|
|
Packit Service |
cd2a00 |
}
|
|
Packit Service |
cd2a00 |
if (zone < 1 || zone > 2) {
|
|
Packit Service |
cd2a00 |
SNDERR("Invalid value for %s", id);
|
|
Packit Service |
cd2a00 |
return -EINVAL;
|
|
Packit Service |
cd2a00 |
}
|
|
Packit Service |
cd2a00 |
continue;
|
|
Packit Service |
cd2a00 |
}
|
|
Packit Service |
cd2a00 |
SNDERR("Unknown field %s", id);
|
|
Packit Service |
cd2a00 |
return -EINVAL;
|
|
Packit Service |
cd2a00 |
}
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
if (access(port, R_OK | W_OK) < 0) {
|
|
Packit Service |
cd2a00 |
err = -errno;
|
|
Packit Service |
cd2a00 |
goto error;
|
|
Packit Service |
cd2a00 |
}
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
arcam_av = calloc(1, sizeof(*arcam_av) + strlen(port) + 1);
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
if (!arcam_av)
|
|
Packit Service |
cd2a00 |
return -ENOMEM;
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
arcam_av->ext.version = SND_CTL_EXT_VERSION;
|
|
Packit Service |
cd2a00 |
arcam_av->ext.card_idx = 0;
|
|
Packit Service |
cd2a00 |
strncpy(arcam_av->ext.id, arcam_av_name, sizeof(arcam_av->ext.id) - 1);
|
|
Packit Service |
cd2a00 |
strncpy(arcam_av->ext.name, arcam_av_name, sizeof(arcam_av->ext.name) - 1);
|
|
Packit Service |
cd2a00 |
strncpy(arcam_av->ext.longname, arcam_av_name, sizeof(arcam_av->ext.longname) - 1);
|
|
Packit Service |
cd2a00 |
strncpy(arcam_av->ext.mixername, arcam_av_name, sizeof(arcam_av->ext.mixername) - 1);
|
|
Packit Service |
cd2a00 |
arcam_av->ext.poll_fd = -1;
|
|
Packit Service |
cd2a00 |
arcam_av->ext.callback = &arcam_av_ext_callback;
|
|
Packit Service |
cd2a00 |
arcam_av->ext.private_data = arcam_av;
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
arcam_av->shm_id = -1;
|
|
Packit Service |
cd2a00 |
arcam_av->port_fd = -1;
|
|
Packit Service |
cd2a00 |
arcam_av->port = strcpy((char*)(arcam_av + 1), port);
|
|
Packit Service |
cd2a00 |
arcam_av->zone = zone != 2 ? ARCAM_AV_ZONE1 : ARCAM_AV_ZONE2;
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
arcam_av->port_fd = arcam_av_connect(arcam_av->port);
|
|
Packit Service |
cd2a00 |
if (arcam_av->port_fd < 0) {
|
|
Packit Service |
cd2a00 |
err = -errno;
|
|
Packit Service |
cd2a00 |
goto error;
|
|
Packit Service |
cd2a00 |
}
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
if (arcam_av_server_start(&arcam_av->server, arcam_av->port)) {
|
|
Packit Service |
cd2a00 |
err = -errno;
|
|
Packit Service |
cd2a00 |
goto error;
|
|
Packit Service |
cd2a00 |
}
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
arcam_av->ext.poll_fd = arcam_av_client(arcam_av->port);
|
|
Packit Service |
cd2a00 |
if (arcam_av->ext.poll_fd < 0) {
|
|
Packit Service |
cd2a00 |
err = -errno;
|
|
Packit Service |
cd2a00 |
goto error;
|
|
Packit Service |
cd2a00 |
}
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
fcntl(arcam_av->ext.poll_fd, F_SETFL, O_NONBLOCK);
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
arcam_av->global = arcam_av_state_attach(arcam_av->port);
|
|
Packit Service |
cd2a00 |
if (!arcam_av->global) {
|
|
Packit Service |
cd2a00 |
err = -errno;
|
|
Packit Service |
cd2a00 |
goto error;
|
|
Packit Service |
cd2a00 |
}
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
err = snd_ctl_ext_create(&arcam_av->ext, name, mode);
|
|
Packit Service |
cd2a00 |
if (err < 0)
|
|
Packit Service |
cd2a00 |
goto error;
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
*handlep = arcam_av->ext.handle;
|
|
Packit Service |
cd2a00 |
return 0;
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
error:
|
|
Packit Service |
cd2a00 |
perror("arcam_av()");
|
|
Packit Service |
cd2a00 |
arcam_av_close(&arcam_av->ext);
|
|
Packit Service |
cd2a00 |
return err;
|
|
Packit Service |
cd2a00 |
}
|
|
Packit Service |
cd2a00 |
|
|
Packit Service |
cd2a00 |
SND_CTL_PLUGIN_SYMBOL(arcam_av);
|