Skip to content

Commit f180b70

Browse files
committed
Chemins : une valeur refusée donne une erreur au lieu d'être ignorée ; tonalité 1 kHz sur la sortie choisie
1 parent b712abd commit f180b70

5 files changed

Lines changed: 22 additions & 6 deletions

File tree

‎app/Sources/LaFleurCore/Chemins.swift‎

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,17 @@ public enum Chemins {
3131
var racine = try jsonObjet(objet)
3232
racine = try remplacer(racine, m[...], valeur, chemin: chemin)
3333
let data = try JSONSerialization.data(withJSONObject: racine)
34-
do { objet = try JSONDecoder().decode(T.self, from: data) } catch { throw Erreur.valeurInvalide(chemin, valeur) }
34+
guard let nouveau = try? JSONDecoder().decode(T.self, from: data) else { throw Erreur.valeurInvalide(chemin, valeur) }
35+
// Le décodage tolérant remplace une valeur illisible par la valeur par défaut, sans erreur :
36+
// on relit pour vérifier que le changement a bien été pris (sinon c'est un refus, pas un succès silencieux).
37+
// (Un objet entier est complété par ses valeurs par défaut : on ne vérifie que les valeurs simples.)
38+
let v = Self.valeur(racine, m)
39+
if !(v is [String: Any]) && !(v is [Any]) {
40+
let voulu = v.map(texte) ?? "null"
41+
let obtenu = lire(chemin, dans: nouveau) ?? "null"
42+
guard voulu == obtenu || (Double(voulu) != nil && Double(voulu) == Double(obtenu)) else { throw Erreur.valeurInvalide(chemin, valeur) }
43+
}
44+
objet = nouveau
3545
}
3646

3747
/// Le modèle sous forme JSON (pour le montrer à l'IA).
@@ -111,7 +121,8 @@ public enum Chemins {
111121
default:
112122
// Valeur absente ou nulle : on devine (nul, booléen, nombre, JSON, sinon texte).
113123
if bas == "null" || bas == "nil" || t.isEmpty { return NSNull() }
114-
if bas == "true" || bas == "false" { return bas == "true" }
124+
if ["true", "oui", "yes", "vrai"].contains(bas) { return true }
125+
if ["false", "non", "no", "faux"].contains(bas) { return false }
115126
if let nombre { return nombre }
116127
if t.hasPrefix("{") || t.hasPrefix("["), let d = t.data(using: .utf8), let o = try? JSONSerialization.jsonObject(with: d) { return o }
117128
return t

‎app/Sources/LaFleurStudio/Audio/MoteurEnregistrement.swift‎

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -278,7 +278,10 @@ final class MoteurEnregistrement: ObservableObject {
278278
// MARK: Tonalité de réglage
279279

280280
/// Signal à 1 kHz, −12 dBFS RMS (0 VU sur l'app), pour régler le niveau d'entrée de la platine.
281-
func basculerTonalite() {
281+
/// `sortie` : la sortie choisie dans les réglages (avant, la tonalité partait sur la sortie par défaut du Mac
282+
/// tant que l'écran des réglages n'avait pas été ouvert).
283+
func basculerTonalite(sortie: String?) {
284+
if sortie != sortieCourante { changerSortie(sortie) }
282285
if source == nil {
283286
var phase = 0.0
284287
let taux = 48000.0

‎app/Sources/LaFleurStudio/Interface/EcranEnregistrer.swift‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ struct EcranEnregistrer: View {
3434
Toggle("Bande rembobinée", isOn: $checklist[2]).toggleStyle(.checkbox)
3535
Toggle("Platine sur \([c.bande.nom, c.reducteur == .aucun ? nil : c.reducteur.nom].compactMap { $0 }.joined(separator: ", "))", isOn: $checklist[3]).toggleStyle(.checkbox)
3636
Toggle("Mode Concentration activé", isOn: $checklist[4]).toggleStyle(.checkbox)
37-
Button(moteur.tonaliteActive ? "Couper la tonalité" : "Tonalité 1 kHz") { moteur.basculerTonalite() }
37+
Button(moteur.tonaliteActive ? "Couper la tonalité" : "Tonalité 1 kHz") { moteur.basculerTonalite(sortie: etat.prefs.sortieAudioUID) }
3838
.buttonStyle(.w98).disabled(enCours)
3939
}
4040
Groupe(titre: "Déroulé") {

‎app/Sources/LaFleurStudio/Interface/PremierDemarrage.swift‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ struct ChoixSortie: View {
150150
}
151151
.labelsHidden()
152152
Button("Actualiser") { sorties = SortiesAudio.lister() }.buttonStyle(.w98)
153-
Button(moteur.tonaliteActive ? "Couper la tonalité" : "Tonalité 1 kHz") { moteur.basculerTonalite() }.buttonStyle(.w98)
153+
Button(moteur.tonaliteActive ? "Couper la tonalité" : "Tonalité 1 kHz") { moteur.basculerTonalite(sortie: etat.prefs.sortieAudioUID) }.buttonStyle(.w98)
154154
}
155155
Text("L'app joue seulement sur cette sortie ; le reste du Mac ne change pas.").foregroundStyle(W98.ombre)
156156
}

‎app/Tests/LaFleurCoreTests/LaFleurCoreTests.swift‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -401,7 +401,9 @@ final class CheminsTests: XCTestCase {
401401
XCTAssertThrowsError(try Chemins.ecrire("etiquettePochette", "ronde", dans: &d))
402402
XCTAssertThrowsError(try Chemins.ecrire("volets", "4.5", dans: &d))
403403
XCTAssertThrowsError(try Chemins.ecrire("codeBarres", "peut-être", dans: &d))
404-
XCTAssertEqual(d, Design(), "un refus ne change rien")
404+
XCTAssertEqual(d.etiquettePochette, .petite, "un refus ne change rien")
405+
XCTAssertEqual(d.volets, 3)
406+
XCTAssertTrue(d.codeBarres)
405407
}
406408

407409
func testProjetEtReglages() throws {

0 commit comments

Comments
 (0)