Changeset View
Changeset View
Standalone View
Standalone View
sys/dev/sound/pcm/feeder_rate.c
| Show First 20 Lines • Show All 83 Lines • ▼ Show 20 Lines | |||||
| #ifdef _KERNEL | #ifdef _KERNEL | ||||
| #define Z_POLYPHASE_MAX 183040 /* 286 taps, 640 phases */ | #define Z_POLYPHASE_MAX 183040 /* 286 taps, 640 phases */ | ||||
| #else | #else | ||||
| #define Z_POLYPHASE_MAX 1464320 /* 286 taps, 5120 phases */ | #define Z_POLYPHASE_MAX 1464320 /* 286 taps, 5120 phases */ | ||||
| #endif | #endif | ||||
| #define Z_RATE_DEFAULT 48000 | #define Z_RATE_DEFAULT 48000 | ||||
| #define Z_RATE_MIN FEEDRATE_RATEMIN | |||||
| #define Z_RATE_MAX FEEDRATE_RATEMAX | |||||
| #define Z_ROUNDHZ FEEDRATE_ROUNDHZ | |||||
| #define Z_ROUNDHZ_MIN FEEDRATE_ROUNDHZ_MIN | |||||
| #define Z_ROUNDHZ_MAX FEEDRATE_ROUNDHZ_MAX | |||||
| #define Z_RATE_SRC FEEDRATE_SRC | |||||
| #define Z_RATE_DST FEEDRATE_DST | |||||
| #define Z_RATE_QUALITY FEEDRATE_QUALITY | |||||
| #define Z_RATE_CHANNELS FEEDRATE_CHANNELS | |||||
| #define Z_PARANOID 1 | #define Z_PARANOID 1 | ||||
| #ifdef _KERNEL | #ifdef _KERNEL | ||||
| #undef Z_USE_ALPHADRIFT | #undef Z_USE_ALPHADRIFT | ||||
| #define Z_USE_ALPHADRIFT 1 | #define Z_USE_ALPHADRIFT 1 | ||||
| #endif | #endif | ||||
| #define Z_FACTOR_MIN 1 | #define Z_FACTOR_MIN 1 | ||||
| Show All 33 Lines | |||||
| #ifdef Z_DIAGNOSTIC | #ifdef Z_DIAGNOSTIC | ||||
| uint32_t z_cycle; /* output cycle, purely for statistical */ | uint32_t z_cycle; /* output cycle, purely for statistical */ | ||||
| #endif | #endif | ||||
| int32_t z_maxfeed; /* maximum feed to avoid 32bit overflow */ | int32_t z_maxfeed; /* maximum feed to avoid 32bit overflow */ | ||||
| z_resampler_t z_resample; | z_resampler_t z_resample; | ||||
| }; | }; | ||||
| int feeder_rate_min = Z_RATE_MIN; | int feeder_rate_min = FEEDRATE_RATEMIN; | ||||
| int feeder_rate_max = Z_RATE_MAX; | int feeder_rate_max = FEEDRATE_RATEMAX; | ||||
| int feeder_rate_round = Z_ROUNDHZ; | int feeder_rate_round = FEEDRATE_ROUNDHZ; | ||||
| int feeder_rate_quality = Z_QUALITY_DEFAULT; | int feeder_rate_quality = Z_QUALITY_DEFAULT; | ||||
| static int feeder_rate_polyphase_max = Z_POLYPHASE_MAX; | static int feeder_rate_polyphase_max = Z_POLYPHASE_MAX; | ||||
| #ifdef _KERNEL | #ifdef _KERNEL | ||||
| static char feeder_rate_presets[] = FEEDER_RATE_PRESETS; | static char feeder_rate_presets[] = FEEDER_RATE_PRESETS; | ||||
| SYSCTL_STRING(_hw_snd, OID_AUTO, feeder_rate_presets, CTLFLAG_RD, | SYSCTL_STRING(_hw_snd, OID_AUTO, feeder_rate_presets, CTLFLAG_RD, | ||||
| &feeder_rate_presets, 0, "compile-time rate presets"); | &feeder_rate_presets, 0, "compile-time rate presets"); | ||||
| ▲ Show 20 Lines • Show All 52 Lines • ▼ Show 20 Lines | sysctl_hw_snd_feeder_rate_round(SYSCTL_HANDLER_ARGS) | ||||
| int err, val; | int err, val; | ||||
| val = feeder_rate_round; | val = feeder_rate_round; | ||||
| err = sysctl_handle_int(oidp, &val, 0, req); | err = sysctl_handle_int(oidp, &val, 0, req); | ||||
| if (err != 0 || req->newptr == NULL || val == feeder_rate_round) | if (err != 0 || req->newptr == NULL || val == feeder_rate_round) | ||||
| return (err); | return (err); | ||||
| if (val < Z_ROUNDHZ_MIN || val > Z_ROUNDHZ_MAX) | if (val < FEEDRATE_ROUNDHZ_MIN || val > FEEDRATE_ROUNDHZ_MAX) | ||||
| return (EINVAL); | return (EINVAL); | ||||
| feeder_rate_round = val - (val % Z_ROUNDHZ); | feeder_rate_round = val - (val % FEEDRATE_ROUNDHZ); | ||||
| return (0); | return (0); | ||||
| } | } | ||||
| SYSCTL_PROC(_hw_snd, OID_AUTO, feeder_rate_round, | SYSCTL_PROC(_hw_snd, OID_AUTO, feeder_rate_round, | ||||
| CTLTYPE_INT | CTLFLAG_RWTUN | CTLFLAG_MPSAFE, 0, sizeof(int), | CTLTYPE_INT | CTLFLAG_RWTUN | CTLFLAG_MPSAFE, 0, sizeof(int), | ||||
| sysctl_hw_snd_feeder_rate_round, "I", | sysctl_hw_snd_feeder_rate_round, "I", | ||||
| "sample rate converter rounding threshold"); | "sample rate converter rounding threshold"); | ||||
| ▲ Show 20 Lines • Show All 1,168 Lines • ▼ Show 20 Lines | |||||
| z_resampler_set(struct pcm_feeder *f, int what, int32_t value) | z_resampler_set(struct pcm_feeder *f, int what, int32_t value) | ||||
| { | { | ||||
| struct z_info *info; | struct z_info *info; | ||||
| int32_t oquality; | int32_t oquality; | ||||
| info = f->data; | info = f->data; | ||||
| switch (what) { | switch (what) { | ||||
| case Z_RATE_SRC: | case FEEDRATE_SRC: | ||||
| if (value < feeder_rate_min || value > feeder_rate_max) | if (value < feeder_rate_min || value > feeder_rate_max) | ||||
| return (E2BIG); | return (E2BIG); | ||||
| if (value == info->rsrc) | if (value == info->rsrc) | ||||
| return (0); | return (0); | ||||
| info->rsrc = value; | info->rsrc = value; | ||||
| break; | break; | ||||
| case Z_RATE_DST: | case FEEDRATE_DST: | ||||
| if (value < feeder_rate_min || value > feeder_rate_max) | if (value < feeder_rate_min || value > feeder_rate_max) | ||||
| return (E2BIG); | return (E2BIG); | ||||
| if (value == info->rdst) | if (value == info->rdst) | ||||
| return (0); | return (0); | ||||
| info->rdst = value; | info->rdst = value; | ||||
| break; | break; | ||||
| case Z_RATE_QUALITY: | case FEEDRATE_QUALITY: | ||||
| if (value < Z_QUALITY_MIN || value > Z_QUALITY_MAX) | if (value < Z_QUALITY_MIN || value > Z_QUALITY_MAX) | ||||
| return (EINVAL); | return (EINVAL); | ||||
| if (value == info->quality) | if (value == info->quality) | ||||
| return (0); | return (0); | ||||
| /* | /* | ||||
| * If we failed to set the requested quality, restore | * If we failed to set the requested quality, restore | ||||
| * the old one. We cannot afford leaving it broken since | * the old one. We cannot afford leaving it broken since | ||||
| * passive feeder chains like vchans never reinitialize | * passive feeder chains like vchans never reinitialize | ||||
| * itself. | * itself. | ||||
| */ | */ | ||||
| oquality = info->quality; | oquality = info->quality; | ||||
| info->quality = value; | info->quality = value; | ||||
| if (z_resampler_setup(f) == 0) | if (z_resampler_setup(f) == 0) | ||||
| return (0); | return (0); | ||||
| info->quality = oquality; | info->quality = oquality; | ||||
| break; | break; | ||||
| case Z_RATE_CHANNELS: | case FEEDRATE_CHANNELS: | ||||
| if (value < SND_CHN_MIN || value > SND_CHN_MAX) | if (value < SND_CHN_MIN || value > SND_CHN_MAX) | ||||
| return (EINVAL); | return (EINVAL); | ||||
| if (value == info->channels) | if (value == info->channels) | ||||
| return (0); | return (0); | ||||
| info->channels = value; | info->channels = value; | ||||
| break; | break; | ||||
| default: | default: | ||||
| return (EINVAL); | return (EINVAL); | ||||
| } | } | ||||
| return (z_resampler_setup(f)); | return (z_resampler_setup(f)); | ||||
| } | } | ||||
| static int | static int | ||||
| z_resampler_get(struct pcm_feeder *f, int what) | z_resampler_get(struct pcm_feeder *f, int what) | ||||
| { | { | ||||
| struct z_info *info; | struct z_info *info; | ||||
| info = f->data; | info = f->data; | ||||
| switch (what) { | switch (what) { | ||||
| case Z_RATE_SRC: | case FEEDRATE_SRC: | ||||
| return (info->rsrc); | return (info->rsrc); | ||||
| case Z_RATE_DST: | case FEEDRATE_DST: | ||||
| return (info->rdst); | return (info->rdst); | ||||
| case Z_RATE_QUALITY: | case FEEDRATE_QUALITY: | ||||
| return (info->quality); | return (info->quality); | ||||
| case Z_RATE_CHANNELS: | case FEEDRATE_CHANNELS: | ||||
| return (info->channels); | return (info->channels); | ||||
| } | } | ||||
| return (-1); | return (-1); | ||||
| } | } | ||||
| static int | static int | ||||
| z_resampler_init(struct pcm_feeder *f) | z_resampler_init(struct pcm_feeder *f) | ||||
| ▲ Show 20 Lines • Show All 205 Lines • Show Last 20 Lines | |||||