summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
a1ba878)
If an attribute gets removed, the old code deferred clearing the
corresponding attribute bit in the afsi of all audio files until
that bit got reclaimed by add_att. This is problematic because of
the new no_attribute_set mood method.
So clear the bit already in the rmatt callback.
__a_unused struct osl_object *result)
{
char *p = query->data;
__a_unused struct osl_object *result)
{
char *p = query->data;
- uint64_t atts_added = 0;
+ unsigned atts_added = 0;
int ret;
while (p < (char *)query->data + query->size) {
int ret;
while (p < (char *)query->data + query->size) {
if (ret < 0)
return ret;
greatest_att_bitnum = PARA_MAX(greatest_att_bitnum, bitnum);
if (ret < 0)
return ret;
greatest_att_bitnum = PARA_MAX(greatest_att_bitnum, bitnum);
- atts_added |= 1 << bitnum;
p += strlen(p) + 1;
}
if (!atts_added)
return 1;
p += strlen(p) + 1;
}
if (!atts_added)
return 1;
- atts_added = ~atts_added;
- ret = audio_file_loop(&atts_added, logical_and_attribute);
- if (ret < 0)
- return ret;
find_greatest_att_bitnum();
find_greatest_att_bitnum();
- return reload_current_mood(); /* FIXME: mood_reload() returns an error */
+ return reload_current_mood(); /* FIXME: returns an error */
}
int com_addatt(__a_unused int fd, int argc, char * const * const argv)
}
int com_addatt(__a_unused int fd, int argc, char * const * const argv)
struct remove_attribute_action_data {
struct para_buffer pb;
int num_removed;
struct remove_attribute_action_data {
struct para_buffer pb;
int num_removed;
+ uint64_t mask_of_removed_atts;
};
static int remove_attribute(struct osl_table *table, struct osl_row *row,
};
static int remove_attribute(struct osl_table *table, struct osl_row *row,
{
struct remove_attribute_action_data *raad = data;
int ret = osl_del_row(table, row);
{
struct remove_attribute_action_data *raad = data;
int ret = osl_del_row(table, row);
+ unsigned char bitnum;
+
+ if (ret < 0) {
+ para_printf(&raad->pb, "%s: %s\n", name, PARA_STRERROR(-ret));
+ return 1;
+ }
+ ret = get_attribute_bitnum_by_name(name, &bitnum);
+ if (ret < 0) {
para_printf(&raad->pb, "%s: %s\n", name, PARA_STRERROR(-ret));
para_printf(&raad->pb, "%s: %s\n", name, PARA_STRERROR(-ret));
- else {
- para_printf(&raad->pb, "removed %s\n", name);
- raad->num_removed++;
+ para_printf(&raad->pb, "removed %s\n", name);
+ raad->num_removed++;
+ raad->mask_of_removed_atts |= (1 << bitnum);
if (ret < 0)
para_printf(&raad.pb, "%s\n", PARA_STRERROR(-ret));
if (raad.num_removed) {
if (ret < 0)
para_printf(&raad.pb, "%s\n", PARA_STRERROR(-ret));
if (raad.num_removed) {
+ uint64_t and_mask = ~raad.mask_of_removed_atts;
+ ret = audio_file_loop(&and_mask, logical_and_attribute);
+ if (ret < 0)
+ para_printf(&raad.pb, "%s\n", PARA_STRERROR(-ret));
find_greatest_att_bitnum();
ret = reload_current_mood();
if (ret < 0)
find_greatest_att_bitnum();
ret = reload_current_mood();
if (ret < 0)