| 1352 | | snd_pcm_hw_param_t var, unsigned int val, int dir) |
| 1353 | | { |
| 1354 | | int changed; |
| 1355 | | if (hw_is_mask(var)) { |
| 1356 | | struct snd_mask *m = hw_param_mask(params, var); |
| 1357 | | if (val == 0 && dir < 0) { |
| 1358 | | changed = -EINVAL; |
| 1359 | | snd_mask_none(m); |
| 1360 | | } else { |
| 1361 | | if (dir > 0) |
| 1362 | | val++; |
| 1363 | | else if (dir < 0) |
| 1364 | | val--; |
| 1365 | | changed = snd_mask_refine_set(hw_param_mask(params, var), val); |
| 1366 | | } |
| 1367 | | } else if (hw_is_interval(var)) { |
| 1368 | | struct snd_interval *i = hw_param_interval(params, var); |
| 1369 | | if (val == 0 && dir < 0) { |
| 1370 | | changed = -EINVAL; |
| 1371 | | snd_interval_none(i); |
| 1372 | | } else if (dir == 0) |
| 1373 | | changed = snd_interval_refine_set(i, val); |
| 1374 | | else { |
| 1375 | | struct snd_interval t; |
| 1376 | | t.openmin = 1; |
| 1377 | | t.openmax = 1; |
| 1378 | | t.empty = 0; |
| 1379 | | t.integer = 0; |
| 1380 | | if (dir < 0) { |
| 1381 | | t.min = val - 1; |
| 1382 | | t.max = val; |
| 1383 | | } else { |
| 1384 | | t.min = val; |
| 1385 | | t.max = val+1; |
| 1386 | | } |
| 1387 | | changed = snd_interval_refine(i, &t); |
| 1388 | | } |
| 1389 | | } else { |
| 1390 | | assert(0); |
| 1391 | | return -EINVAL; |
| 1392 | | } |
| 1393 | | if (changed) { |
| 1394 | | params->cmask |= 1 << var; |
| 1395 | | params->rmask |= 1 << var; |
| 1396 | | } |
| 1397 | | return changed; |
| 1398 | | } |
| | 1352 | snd_pcm_hw_param_t var, unsigned int val, |
| | 1353 | int dir) |
| | 1354 | { |
| | 1355 | int changed; |
| | 1356 | if (hw_is_mask(var)) { |
| | 1357 | struct snd_mask *m = hw_param_mask(params, var); |
| | 1358 | if (val == 0 && dir < 0) { |
| | 1359 | changed = -EINVAL; |
| | 1360 | snd_mask_none(m); |
| | 1361 | } else { |
| | 1362 | if (dir > 0) |
| | 1363 | val++; |
| | 1364 | else if (dir < 0) |
| | 1365 | val--; |
| | 1366 | changed = snd_mask_refine_set(hw_param_mask(params, var), val); |
| | 1367 | } |
| | 1368 | } else if (hw_is_interval(var)) { |
| | 1369 | struct snd_interval *i = hw_param_interval(params, var); |
| | 1370 | if (val == 0 && dir < 0) { |
| | 1371 | changed = -EINVAL; |
| | 1372 | snd_interval_none(i); |
| | 1373 | } else if (dir == 0) |
| | 1374 | changed = snd_interval_refine_set(i, val); |
| | 1375 | else { |
| | 1376 | struct snd_interval t; |
| | 1377 | t.openmin = 1; |
| | 1378 | t.openmax = 1; |
| | 1379 | t.empty = 0; |
| | 1380 | t.integer = 0; |
| | 1381 | if (dir < 0) { |
| | 1382 | t.min = val - 1; |
| | 1383 | t.max = val; |
| | 1384 | } else { |
| | 1385 | t.min = val; |
| | 1386 | t.max = val+1; |
| | 1387 | } |
| | 1388 | changed = snd_interval_refine(i, &t); |
| | 1389 | } |
| | 1390 | } else |
| | 1391 | return -EINVAL; |
| | 1392 | if (changed) { |
| | 1393 | params->cmask |= 1 << var; |
| | 1394 | params->rmask |= 1 << var; |
| | 1395 | } |
| | 1396 | return changed; |
| | 1397 | } |
| | 1398 | |