feat(renaser): Fase 12 — la bocina del PC como capacidad de host
La Fase 11 dio al userspace un reloj; la Fase 12, una voz. Hasta hoy renaser solo sabía dibujar para llamar la atención. - Driver `drivers/altavoz`: el canal 2 del PIT como generador de onda cuadrada + la compuerta del puerto 0x61. El canal 0 —latido del kernel— no se toca. `tono(hz)` es su única vía; un 0 la silencia. - Capacidad `sys_tono(frecuencia_hz)` — la undécima función del host. La bocina es un recurso único: pertenece a la ventana ENFOCADA, como el teclado desde la Fase 8c. Al cambiar el foco, el compositor la calla; la nueva dueña la reclama en su próximo fotograma. - App nueva `tonada` (`apps/tonada/`, wasm32): toca una escala de Do mayor y la dibuja como una escalera de barras. Junta el reloj (`sys_tiempo_mono`) y la bocina (`sys_tono`). - `GENESIS` crece de 6 a 7 apps; `tonada` es la maestra del escritorio. Verificado en QEMU. Visual: la escalera de `tonada` recorre la escala con el tiempo. Sonido: con la bocina enrutada a un WAV, el PCM capturado es una onda cuadrada oscilante de ~375 Hz — la frecuencia media de la escala de Do mayor. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -14,7 +14,8 @@
|
||||
// * sys_object_fijar_raiz — coronar un objeto como raiz;
|
||||
// * sys_estado_cargar — leer el estado persistido de la app (Fase 7c);
|
||||
// * sys_estado_guardar — anclar el estado persistido de la app (Fase 7c);
|
||||
// * sys_tiempo_mono — leer el reloj monotono del sistema (Fase 11).
|
||||
// * sys_tiempo_mono — leer el reloj monotono del sistema (Fase 11);
|
||||
// * sys_tono — hacer sonar la bocina del PC (Fase 12).
|
||||
//
|
||||
// GUARDARRAIL: el kernel valida MATEMATICAMENTE todo puntero que el modulo le
|
||||
// entrega contra los limites reales de su memoria lineal. No se confia en que
|
||||
@@ -457,5 +458,22 @@ pub(crate) fn enlazar_capacidades(
|
||||
},
|
||||
)?;
|
||||
|
||||
// --- CAPACIDAD 11 :: sys_tono(frecuencia_hz) ---
|
||||
// Hace sonar la bocina del PC a `frecuencia_hz` (un 0 la silencia). La
|
||||
// bocina es un recurso UNICO y global: para que dos apps no se la disputen,
|
||||
// pertenece —como el teclado desde la Fase 8c— a la ventana ENFOCADA. Una
|
||||
// app sin foco puede pedir un tono; sencillamente, no se oye. Y cuando el
|
||||
// foco cambia, el compositor calla la bocina: la nueva dueña la reclamara
|
||||
// en su proximo fotograma si quiere sonar.
|
||||
enlazador.func_wrap(
|
||||
"renaser",
|
||||
"sys_tono",
|
||||
|caller: Caller<'_, ContextoCapacidades>, frecuencia_hz: u32| {
|
||||
if crate::compositor::foco() == caller.data().indice_app {
|
||||
crate::drivers::altavoz::tono(frecuencia_hz);
|
||||
}
|
||||
},
|
||||
)?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user