Loading Documentation/DocBook/alsa-driver-api.tmpl +2 −0 Original line number Diff line number Diff line Loading @@ -99,6 +99,8 @@ <chapter><title>Compress Offload</title> <sect1><title>Compress Offload API</title> !Esound/core/compress_offload.c !Iinclude/uapi/sound/compress_offload.h !Iinclude/uapi/sound/compress_params.h !Iinclude/sound/compress_driver.h </sect1> </chapter> Loading include/sound/jack.h +15 −1 Original line number Diff line number Diff line Loading @@ -28,7 +28,21 @@ struct input_dev; /** * enum snd_jack_types: Jack types which can be reported * enum snd_jack_types - Jack types which can be reported * @SND_JACK_HEADPHONE: Headphone * @SND_JACK_MICROPHONE: Microphone * @SND_JACK_HEADSET: Headset * @SND_JACK_LINEOUT: Line out * @SND_JACK_MECHANICAL: Mechanical switch * @SND_JACK_VIDEOOUT: Video out * @SND_JACK_AVOUT: AV (Audio Video) out * @SND_JACK_LINEIN: Line in * @SND_JACK_BTN_0: Button 0 * @SND_JACK_BTN_1: Button 1 * @SND_JACK_BTN_2: Button 2 * @SND_JACK_BTN_3: Button 3 * @SND_JACK_BTN_4: Button 4 * @SND_JACK_BTN_5: Button 5 * * These values are used as a bitmask. * Loading include/uapi/sound/compress_offload.h +9 −8 Original line number Diff line number Diff line Loading @@ -32,7 +32,7 @@ #define SNDRV_COMPRESS_VERSION SNDRV_PROTOCOL_VERSION(0, 1, 2) /** * struct snd_compressed_buffer: compressed buffer * struct snd_compressed_buffer - compressed buffer * @fragment_size: size of buffer fragment in bytes * @fragments: number of such fragments */ Loading @@ -42,7 +42,7 @@ struct snd_compressed_buffer { } __attribute__((packed, aligned(4))); /** * struct snd_compr_params: compressed stream params * struct snd_compr_params - compressed stream params * @buffer: buffer description * @codec: codec parameters * @no_wake_mode: dont wake on fragment elapsed Loading @@ -54,7 +54,7 @@ struct snd_compr_params { } __attribute__((packed, aligned(4))); /** * struct snd_compr_tstamp: timestamp descriptor * struct snd_compr_tstamp - timestamp descriptor * @byte_offset: Byte offset in ring buffer to DSP * @copied_total: Total number of bytes copied from/to ring buffer to/by DSP * @pcm_frames: Frames decoded or encoded by DSP. This field will evolve by Loading @@ -73,7 +73,7 @@ struct snd_compr_tstamp { } __attribute__((packed, aligned(4))); /** * struct snd_compr_avail: avail descriptor * struct snd_compr_avail - avail descriptor * @avail: Number of bytes available in ring buffer for writing/reading * @tstamp: timestamp infomation */ Loading @@ -88,7 +88,7 @@ enum snd_compr_direction { }; /** * struct snd_compr_caps: caps descriptor * struct snd_compr_caps - caps descriptor * @codecs: pointer to array of codecs * @direction: direction supported. Of type snd_compr_direction * @min_fragment_size: minimum fragment supported by DSP Loading @@ -110,7 +110,7 @@ struct snd_compr_caps { } __attribute__((packed, aligned(4))); /** * struct snd_compr_codec_caps: query capability of codec * struct snd_compr_codec_caps - query capability of codec * @codec: codec for which capability is queried * @num_descriptors: number of codec descriptors * @descriptor: array of codec capability descriptor Loading @@ -122,18 +122,19 @@ struct snd_compr_codec_caps { } __attribute__((packed, aligned(4))); /** * enum sndrv_compress_encoder * @SNDRV_COMPRESS_ENCODER_PADDING: no of samples appended by the encoder at the * end of the track * @SNDRV_COMPRESS_ENCODER_DELAY: no of samples inserted by the encoder at the * beginning of the track */ enum { enum sndrv_compress_encoder { SNDRV_COMPRESS_ENCODER_PADDING = 1, SNDRV_COMPRESS_ENCODER_DELAY = 2, }; /** * struct snd_compr_metadata: compressed stream metadata * struct snd_compr_metadata - compressed stream metadata * @key: key id * @value: key value */ Loading sound/pci/hda/hda_auto_parser.c +64 −2 Original line number Diff line number Diff line Loading @@ -441,6 +441,13 @@ int snd_hda_parse_pin_defcfg(struct hda_codec *codec, } EXPORT_SYMBOL_GPL(snd_hda_parse_pin_defcfg); /** * snd_hda_get_input_pin_attr - Get the input pin attribute from pin config * @def_conf: pin configuration value * * Guess the input pin attribute (INPUT_PIN_ATTR_XXX) from the given * default pin configuration value. */ int snd_hda_get_input_pin_attr(unsigned int def_conf) { unsigned int loc = get_defcfg_location(def_conf); Loading @@ -464,12 +471,15 @@ EXPORT_SYMBOL_GPL(snd_hda_get_input_pin_attr); /** * hda_get_input_pin_label - Give a label for the given input pin * @codec: the HDA codec * @item: ping config item to refer * @pin: the pin NID * @check_location: flag to add the jack location prefix * * When check_location is true, the function checks the pin location * When @check_location is true, the function checks the pin location * for mic and line-in pins, and set an appropriate prefix like "Front", * "Rear", "Internal". */ static const char *hda_get_input_pin_label(struct hda_codec *codec, const struct auto_pin_cfg_item *item, hda_nid_t pin, bool check_location) Loading Loading @@ -550,6 +560,9 @@ static int check_mic_location_need(struct hda_codec *codec, /** * hda_get_autocfg_input_label - Get a label for the given input * @codec: the HDA codec * @cfg: the parsed pin configuration * @input: the input index number * * Get a label for the given input pin defined by the autocfg item. * Unlike hda_get_input_pin_label(), this function checks all inputs Loading Loading @@ -677,6 +690,12 @@ static int fill_audio_out_name(struct hda_codec *codec, hda_nid_t nid, /** * snd_hda_get_pin_label - Get a label for the given I/O pin * @codec: the HDA codec * @nid: pin NID * @cfg: the parsed pin configuration * @label: the string buffer to store * @maxlen: the max length of string buffer (including termination) * @indexp: the pointer to return the index number (for multiple ctls) * * Get a label for the given pin. This function works for both input and * output pins. When @cfg is given as non-NULL, the function tries to get Loading Loading @@ -748,6 +767,14 @@ int snd_hda_get_pin_label(struct hda_codec *codec, hda_nid_t nid, } EXPORT_SYMBOL_GPL(snd_hda_get_pin_label); /** * snd_hda_add_verbs - Add verbs to the init list * @codec: the HDA codec * @list: zero-terminated verb list to add * * Append the given verb list to the execution list. The verbs will be * performed at init and resume time via snd_hda_apply_verbs(). */ int snd_hda_add_verbs(struct hda_codec *codec, const struct hda_verb *list) { Loading @@ -760,6 +787,10 @@ int snd_hda_add_verbs(struct hda_codec *codec, } EXPORT_SYMBOL_GPL(snd_hda_add_verbs); /** * snd_hda_apply_verbs - Execute the init verb lists * @codec: the HDA codec */ void snd_hda_apply_verbs(struct hda_codec *codec) { int i; Loading @@ -770,6 +801,11 @@ void snd_hda_apply_verbs(struct hda_codec *codec) } EXPORT_SYMBOL_GPL(snd_hda_apply_verbs); /** * snd_hda_apply_pincfgs - Set each pin config in the given list * @codec: the HDA codec * @cfg: NULL-terminated pin config table */ void snd_hda_apply_pincfgs(struct hda_codec *codec, const struct hda_pintbl *cfg) { Loading Loading @@ -837,6 +873,11 @@ static void apply_fixup(struct hda_codec *codec, int id, int action, int depth) } } /** * snd_hda_apply_fixup - Apply the fixup chain with the given action * @codec: the HDA codec * @action: fixup action (HDA_FIXUP_ACT_XXX) */ void snd_hda_apply_fixup(struct hda_codec *codec, int action) { if (codec->fixup_list) Loading @@ -855,6 +896,12 @@ static bool pin_config_match(struct hda_codec *codec, return true; } /** * snd_hda_pick_pin_fixup - Pick up a fixup matching with the pin quirk list * @codec: the HDA codec * @pin_quirk: zero-terminated pin quirk list * @fixlist: the fixup list */ void snd_hda_pick_pin_fixup(struct hda_codec *codec, const struct snd_hda_pin_quirk *pin_quirk, const struct hda_fixup *fixlist) Loading @@ -881,6 +928,21 @@ void snd_hda_pick_pin_fixup(struct hda_codec *codec, } EXPORT_SYMBOL_GPL(snd_hda_pick_pin_fixup); /** * snd_hda_pick_fixup - Pick up a fixup matching with PCI/codec SSID or model string * @codec: the HDA codec * @models: NULL-terminated model string list * @quirk: zero-terminated PCI/codec SSID quirk list * @fixlist: the fixup list * * Pick up a fixup entry matching with the given model string or SSID. * If a fixup was already set beforehand, the function doesn't do anything. * When a special model string "nofixup" is given, also no fixup is applied. * * The function tries to find the matching model name at first, if given. * If nothing matched, try to look up the PCI SSID. * If still nothing matched, try to look up the codec SSID. */ void snd_hda_pick_fixup(struct hda_codec *codec, const struct hda_model_fixup *models, const struct snd_pci_quirk *quirk, Loading sound/pci/hda/hda_beep.c +38 −0 Original line number Diff line number Diff line Loading @@ -175,6 +175,11 @@ static int snd_hda_do_attach(struct hda_beep *beep) return 0; } /** * snd_hda_enable_beep_device - Turn on/off beep sound * @codec: the HDA codec * @enable: flag to turn on/off */ int snd_hda_enable_beep_device(struct hda_codec *codec, int enable) { struct hda_beep *beep = codec->beep; Loading @@ -191,6 +196,20 @@ int snd_hda_enable_beep_device(struct hda_codec *codec, int enable) } EXPORT_SYMBOL_GPL(snd_hda_enable_beep_device); /** * snd_hda_attach_beep_device - Attach a beep input device * @codec: the HDA codec * @nid: beep NID * * Attach a beep object to the given widget. If beep hint is turned off * explicitly or beep_mode of the codec is turned off, this doesn't nothing. * * The attached beep device has to be registered via * snd_hda_register_beep_device() and released via snd_hda_detach_beep_device() * appropriately. * * Currently, only one beep device is allowed to each codec. */ int snd_hda_attach_beep_device(struct hda_codec *codec, int nid) { struct hda_beep *beep; Loading Loading @@ -228,6 +247,10 @@ int snd_hda_attach_beep_device(struct hda_codec *codec, int nid) } EXPORT_SYMBOL_GPL(snd_hda_attach_beep_device); /** * snd_hda_detach_beep_device - Detach the beep device * @codec: the HDA codec */ void snd_hda_detach_beep_device(struct hda_codec *codec) { struct hda_beep *beep = codec->beep; Loading @@ -240,6 +263,10 @@ void snd_hda_detach_beep_device(struct hda_codec *codec) } EXPORT_SYMBOL_GPL(snd_hda_detach_beep_device); /** * snd_hda_register_beep_device - Register the beep device * @codec: the HDA codec */ int snd_hda_register_beep_device(struct hda_codec *codec) { struct hda_beep *beep = codec->beep; Loading Loading @@ -269,6 +296,12 @@ static bool ctl_has_mute(struct snd_kcontrol *kcontrol) } /* get/put callbacks for beep mute mixer switches */ /** * snd_hda_mixer_amp_switch_get_beep - Get callback for beep controls * @kcontrol: ctl element * @ucontrol: pointer to get/store the data */ int snd_hda_mixer_amp_switch_get_beep(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { Loading @@ -283,6 +316,11 @@ int snd_hda_mixer_amp_switch_get_beep(struct snd_kcontrol *kcontrol, } EXPORT_SYMBOL_GPL(snd_hda_mixer_amp_switch_get_beep); /** * snd_hda_mixer_amp_switch_put_beep - Put callback for beep controls * @kcontrol: ctl element * @ucontrol: pointer to get/store the data */ int snd_hda_mixer_amp_switch_put_beep(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { Loading Loading
Documentation/DocBook/alsa-driver-api.tmpl +2 −0 Original line number Diff line number Diff line Loading @@ -99,6 +99,8 @@ <chapter><title>Compress Offload</title> <sect1><title>Compress Offload API</title> !Esound/core/compress_offload.c !Iinclude/uapi/sound/compress_offload.h !Iinclude/uapi/sound/compress_params.h !Iinclude/sound/compress_driver.h </sect1> </chapter> Loading
include/sound/jack.h +15 −1 Original line number Diff line number Diff line Loading @@ -28,7 +28,21 @@ struct input_dev; /** * enum snd_jack_types: Jack types which can be reported * enum snd_jack_types - Jack types which can be reported * @SND_JACK_HEADPHONE: Headphone * @SND_JACK_MICROPHONE: Microphone * @SND_JACK_HEADSET: Headset * @SND_JACK_LINEOUT: Line out * @SND_JACK_MECHANICAL: Mechanical switch * @SND_JACK_VIDEOOUT: Video out * @SND_JACK_AVOUT: AV (Audio Video) out * @SND_JACK_LINEIN: Line in * @SND_JACK_BTN_0: Button 0 * @SND_JACK_BTN_1: Button 1 * @SND_JACK_BTN_2: Button 2 * @SND_JACK_BTN_3: Button 3 * @SND_JACK_BTN_4: Button 4 * @SND_JACK_BTN_5: Button 5 * * These values are used as a bitmask. * Loading
include/uapi/sound/compress_offload.h +9 −8 Original line number Diff line number Diff line Loading @@ -32,7 +32,7 @@ #define SNDRV_COMPRESS_VERSION SNDRV_PROTOCOL_VERSION(0, 1, 2) /** * struct snd_compressed_buffer: compressed buffer * struct snd_compressed_buffer - compressed buffer * @fragment_size: size of buffer fragment in bytes * @fragments: number of such fragments */ Loading @@ -42,7 +42,7 @@ struct snd_compressed_buffer { } __attribute__((packed, aligned(4))); /** * struct snd_compr_params: compressed stream params * struct snd_compr_params - compressed stream params * @buffer: buffer description * @codec: codec parameters * @no_wake_mode: dont wake on fragment elapsed Loading @@ -54,7 +54,7 @@ struct snd_compr_params { } __attribute__((packed, aligned(4))); /** * struct snd_compr_tstamp: timestamp descriptor * struct snd_compr_tstamp - timestamp descriptor * @byte_offset: Byte offset in ring buffer to DSP * @copied_total: Total number of bytes copied from/to ring buffer to/by DSP * @pcm_frames: Frames decoded or encoded by DSP. This field will evolve by Loading @@ -73,7 +73,7 @@ struct snd_compr_tstamp { } __attribute__((packed, aligned(4))); /** * struct snd_compr_avail: avail descriptor * struct snd_compr_avail - avail descriptor * @avail: Number of bytes available in ring buffer for writing/reading * @tstamp: timestamp infomation */ Loading @@ -88,7 +88,7 @@ enum snd_compr_direction { }; /** * struct snd_compr_caps: caps descriptor * struct snd_compr_caps - caps descriptor * @codecs: pointer to array of codecs * @direction: direction supported. Of type snd_compr_direction * @min_fragment_size: minimum fragment supported by DSP Loading @@ -110,7 +110,7 @@ struct snd_compr_caps { } __attribute__((packed, aligned(4))); /** * struct snd_compr_codec_caps: query capability of codec * struct snd_compr_codec_caps - query capability of codec * @codec: codec for which capability is queried * @num_descriptors: number of codec descriptors * @descriptor: array of codec capability descriptor Loading @@ -122,18 +122,19 @@ struct snd_compr_codec_caps { } __attribute__((packed, aligned(4))); /** * enum sndrv_compress_encoder * @SNDRV_COMPRESS_ENCODER_PADDING: no of samples appended by the encoder at the * end of the track * @SNDRV_COMPRESS_ENCODER_DELAY: no of samples inserted by the encoder at the * beginning of the track */ enum { enum sndrv_compress_encoder { SNDRV_COMPRESS_ENCODER_PADDING = 1, SNDRV_COMPRESS_ENCODER_DELAY = 2, }; /** * struct snd_compr_metadata: compressed stream metadata * struct snd_compr_metadata - compressed stream metadata * @key: key id * @value: key value */ Loading
sound/pci/hda/hda_auto_parser.c +64 −2 Original line number Diff line number Diff line Loading @@ -441,6 +441,13 @@ int snd_hda_parse_pin_defcfg(struct hda_codec *codec, } EXPORT_SYMBOL_GPL(snd_hda_parse_pin_defcfg); /** * snd_hda_get_input_pin_attr - Get the input pin attribute from pin config * @def_conf: pin configuration value * * Guess the input pin attribute (INPUT_PIN_ATTR_XXX) from the given * default pin configuration value. */ int snd_hda_get_input_pin_attr(unsigned int def_conf) { unsigned int loc = get_defcfg_location(def_conf); Loading @@ -464,12 +471,15 @@ EXPORT_SYMBOL_GPL(snd_hda_get_input_pin_attr); /** * hda_get_input_pin_label - Give a label for the given input pin * @codec: the HDA codec * @item: ping config item to refer * @pin: the pin NID * @check_location: flag to add the jack location prefix * * When check_location is true, the function checks the pin location * When @check_location is true, the function checks the pin location * for mic and line-in pins, and set an appropriate prefix like "Front", * "Rear", "Internal". */ static const char *hda_get_input_pin_label(struct hda_codec *codec, const struct auto_pin_cfg_item *item, hda_nid_t pin, bool check_location) Loading Loading @@ -550,6 +560,9 @@ static int check_mic_location_need(struct hda_codec *codec, /** * hda_get_autocfg_input_label - Get a label for the given input * @codec: the HDA codec * @cfg: the parsed pin configuration * @input: the input index number * * Get a label for the given input pin defined by the autocfg item. * Unlike hda_get_input_pin_label(), this function checks all inputs Loading Loading @@ -677,6 +690,12 @@ static int fill_audio_out_name(struct hda_codec *codec, hda_nid_t nid, /** * snd_hda_get_pin_label - Get a label for the given I/O pin * @codec: the HDA codec * @nid: pin NID * @cfg: the parsed pin configuration * @label: the string buffer to store * @maxlen: the max length of string buffer (including termination) * @indexp: the pointer to return the index number (for multiple ctls) * * Get a label for the given pin. This function works for both input and * output pins. When @cfg is given as non-NULL, the function tries to get Loading Loading @@ -748,6 +767,14 @@ int snd_hda_get_pin_label(struct hda_codec *codec, hda_nid_t nid, } EXPORT_SYMBOL_GPL(snd_hda_get_pin_label); /** * snd_hda_add_verbs - Add verbs to the init list * @codec: the HDA codec * @list: zero-terminated verb list to add * * Append the given verb list to the execution list. The verbs will be * performed at init and resume time via snd_hda_apply_verbs(). */ int snd_hda_add_verbs(struct hda_codec *codec, const struct hda_verb *list) { Loading @@ -760,6 +787,10 @@ int snd_hda_add_verbs(struct hda_codec *codec, } EXPORT_SYMBOL_GPL(snd_hda_add_verbs); /** * snd_hda_apply_verbs - Execute the init verb lists * @codec: the HDA codec */ void snd_hda_apply_verbs(struct hda_codec *codec) { int i; Loading @@ -770,6 +801,11 @@ void snd_hda_apply_verbs(struct hda_codec *codec) } EXPORT_SYMBOL_GPL(snd_hda_apply_verbs); /** * snd_hda_apply_pincfgs - Set each pin config in the given list * @codec: the HDA codec * @cfg: NULL-terminated pin config table */ void snd_hda_apply_pincfgs(struct hda_codec *codec, const struct hda_pintbl *cfg) { Loading Loading @@ -837,6 +873,11 @@ static void apply_fixup(struct hda_codec *codec, int id, int action, int depth) } } /** * snd_hda_apply_fixup - Apply the fixup chain with the given action * @codec: the HDA codec * @action: fixup action (HDA_FIXUP_ACT_XXX) */ void snd_hda_apply_fixup(struct hda_codec *codec, int action) { if (codec->fixup_list) Loading @@ -855,6 +896,12 @@ static bool pin_config_match(struct hda_codec *codec, return true; } /** * snd_hda_pick_pin_fixup - Pick up a fixup matching with the pin quirk list * @codec: the HDA codec * @pin_quirk: zero-terminated pin quirk list * @fixlist: the fixup list */ void snd_hda_pick_pin_fixup(struct hda_codec *codec, const struct snd_hda_pin_quirk *pin_quirk, const struct hda_fixup *fixlist) Loading @@ -881,6 +928,21 @@ void snd_hda_pick_pin_fixup(struct hda_codec *codec, } EXPORT_SYMBOL_GPL(snd_hda_pick_pin_fixup); /** * snd_hda_pick_fixup - Pick up a fixup matching with PCI/codec SSID or model string * @codec: the HDA codec * @models: NULL-terminated model string list * @quirk: zero-terminated PCI/codec SSID quirk list * @fixlist: the fixup list * * Pick up a fixup entry matching with the given model string or SSID. * If a fixup was already set beforehand, the function doesn't do anything. * When a special model string "nofixup" is given, also no fixup is applied. * * The function tries to find the matching model name at first, if given. * If nothing matched, try to look up the PCI SSID. * If still nothing matched, try to look up the codec SSID. */ void snd_hda_pick_fixup(struct hda_codec *codec, const struct hda_model_fixup *models, const struct snd_pci_quirk *quirk, Loading
sound/pci/hda/hda_beep.c +38 −0 Original line number Diff line number Diff line Loading @@ -175,6 +175,11 @@ static int snd_hda_do_attach(struct hda_beep *beep) return 0; } /** * snd_hda_enable_beep_device - Turn on/off beep sound * @codec: the HDA codec * @enable: flag to turn on/off */ int snd_hda_enable_beep_device(struct hda_codec *codec, int enable) { struct hda_beep *beep = codec->beep; Loading @@ -191,6 +196,20 @@ int snd_hda_enable_beep_device(struct hda_codec *codec, int enable) } EXPORT_SYMBOL_GPL(snd_hda_enable_beep_device); /** * snd_hda_attach_beep_device - Attach a beep input device * @codec: the HDA codec * @nid: beep NID * * Attach a beep object to the given widget. If beep hint is turned off * explicitly or beep_mode of the codec is turned off, this doesn't nothing. * * The attached beep device has to be registered via * snd_hda_register_beep_device() and released via snd_hda_detach_beep_device() * appropriately. * * Currently, only one beep device is allowed to each codec. */ int snd_hda_attach_beep_device(struct hda_codec *codec, int nid) { struct hda_beep *beep; Loading Loading @@ -228,6 +247,10 @@ int snd_hda_attach_beep_device(struct hda_codec *codec, int nid) } EXPORT_SYMBOL_GPL(snd_hda_attach_beep_device); /** * snd_hda_detach_beep_device - Detach the beep device * @codec: the HDA codec */ void snd_hda_detach_beep_device(struct hda_codec *codec) { struct hda_beep *beep = codec->beep; Loading @@ -240,6 +263,10 @@ void snd_hda_detach_beep_device(struct hda_codec *codec) } EXPORT_SYMBOL_GPL(snd_hda_detach_beep_device); /** * snd_hda_register_beep_device - Register the beep device * @codec: the HDA codec */ int snd_hda_register_beep_device(struct hda_codec *codec) { struct hda_beep *beep = codec->beep; Loading Loading @@ -269,6 +296,12 @@ static bool ctl_has_mute(struct snd_kcontrol *kcontrol) } /* get/put callbacks for beep mute mixer switches */ /** * snd_hda_mixer_amp_switch_get_beep - Get callback for beep controls * @kcontrol: ctl element * @ucontrol: pointer to get/store the data */ int snd_hda_mixer_amp_switch_get_beep(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { Loading @@ -283,6 +316,11 @@ int snd_hda_mixer_amp_switch_get_beep(struct snd_kcontrol *kcontrol, } EXPORT_SYMBOL_GPL(snd_hda_mixer_amp_switch_get_beep); /** * snd_hda_mixer_amp_switch_put_beep - Put callback for beep controls * @kcontrol: ctl element * @ucontrol: pointer to get/store the data */ int snd_hda_mixer_amp_switch_put_beep(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { Loading