如何添加警报声音(音频)?

Posted

技术标签:

【中文标题】如何添加警报声音(音频)?【英文标题】:How do I add an alarm sound(Audio)? 【发布时间】:2022-01-23 03:30:17 【问题描述】:

我正在用QML写一个闹钟,我需要在闹钟日期和时间到达系统时添加闹钟声音(一般在闹钟正常运行时触发闹钟声音)。我该怎么做?

这里有闹钟(包括添加的):

AlarmModel.qml

import QtQuick 2.11
import QtQuick.Controls 2.4
import QtQuick.Layouts 1.11
import QtQuick.Window 2.11

// Populate the model with some sample data.
ListModel 
    id: alarmModel

    ListElement 
        hour: 6
        minute: 1
        day: 3
        month: 8
        year: 2021
        activated: true
        label: "Wake up"
        repeat: true
        daysToRepeat: [
            ListElement  dayOfWeek: 0; repeat: false ,
            ListElement  dayOfWeek: 1; repeat: false ,
            ListElement  dayOfWeek: 2; repeat: false ,
            ListElement  dayOfWeek: 3; repeat: false ,
            ListElement  dayOfWeek: 4; repeat: false ,
            ListElement  dayOfWeek: 5; repeat: false ,
            ListElement  dayOfWeek: 6; repeat: false 
        ]
    
    ListElement 
        hour: 6
        minute: 0
        day: 3
        month: 8
        year: 2021
        activated: true
        label: "Wake up"
        repeat: true
        daysToRepeat: [
            ListElement  dayOfWeek: 0; repeat: true ,
            ListElement  dayOfWeek: 1; repeat: true ,
            ListElement  dayOfWeek: 2; repeat: true ,
            ListElement  dayOfWeek: 3; repeat: true ,
            ListElement  dayOfWeek: 4; repeat: true ,
            ListElement  dayOfWeek: 5; repeat: false ,
            ListElement  dayOfWeek: 6; repeat: false 
        ]
    
    ListElement 
        hour: 7
        minute: 0
        day: 3
        month: 8
        year: 2021
        activated: false
        label: "Exercise"
        repeat: true
        daysToRepeat: [
            ListElement  dayOfWeek: 0; repeat: true ,
            ListElement  dayOfWeek: 1; repeat: true ,
            ListElement  dayOfWeek: 2; repeat: true ,
            ListElement  dayOfWeek: 3; repeat: true ,
            ListElement  dayOfWeek: 4; repeat: true ,
            ListElement  dayOfWeek: 5; repeat: true ,
            ListElement  dayOfWeek: 6; repeat: true 
        ]
    
    ListElement 
        hour: 5
        minute: 15
        day: 1
        month: 9
        year: 2021
        activated: true
        label: ""
        repeat: false
        daysToRepeat: [
            ListElement  dayOfWeek: 0; repeat: false ,
            ListElement  dayOfWeek: 1; repeat: false ,
            ListElement  dayOfWeek: 2; repeat: false ,
            ListElement  dayOfWeek: 3; repeat: false ,
            ListElement  dayOfWeek: 4; repeat: false ,
            ListElement  dayOfWeek: 5; repeat: false ,
            ListElement  dayOfWeek: 6; repeat: false 
        ]
    
    ListElement 
        hour: 5
        minute: 45
        day: 3
        month: 4
        year: 2021
        activated: false
        label: ""
        repeat: false
        daysToRepeat: [
            ListElement  dayOfWeek: 0; repeat: false ,
            ListElement  dayOfWeek: 1; repeat: false ,
            ListElement  dayOfWeek: 2; repeat: false ,
            ListElement  dayOfWeek: 3; repeat: false ,
            ListElement  dayOfWeek: 4; repeat: false ,
            ListElement  dayOfWeek: 5; repeat: false ,
            ListElement  dayOfWeek: 6; repeat: false 
        ]
    
    function sortModel()
        
            for(var i=0; i<count; i++)
            
                for(var j=0; j<count; j++)
                
                    if(get(i).year < get(j).year)
                        move(i,j,1)
                    else if(get(i).year === get(j).year && get(i).month < get(j).month)
                        move(i,j,1)
                    else if(get(i).year === get(j).year && get(i).month === get(j).month && get(i).day < get(j).day)
                        move(i,j,1)
                    else if(get(i).year === get(j).year && get(i).month === get(j).month && get(i).day === get(j).day && get(i).hour < get(j).hour)
                        move(i,j,1)
                    else if(get(i).year === get(j).year && get(i).month === get(j).month && get(i).day === get(j).day && get(i).hour === get(j).hour && get(i).minute < get(j).minute)
                        move(i,j,1)
                
            
        

       Component.onCompleted: sortModel()

这里增加了一个闹钟:

AlarmDialog.qml

import QtQuick 2.11
import QtQuick.Controls 2.4
import QtQuick.Layouts 1.11
import QtQuick.Window 2.11

Dialog 
    id: alarmDialog
    title: "Add new alarm"
    modal: true
    standardButtons: DialogButtonBox.Ok | DialogButtonBox.Cancel

    property AlarmModel alarmModel

    function formatNumber(number) 
        return number < 10 && number >= 0 ? "0" + number : number.toString()
        
    onAccepted: 
        alarmModel.insert(alarmModel.count,
            "hour": hoursTumbler.currentIndex,
            "minute": minutesTumbler.currentIndex,
            "day": dayTumbler.currentIndex + 1,
            "month": monthTumbler.currentIndex + 1,
            "year": yearTumbler.years[yearTumbler.currentIndex],
            "activated": true,
            "label": "",
            "repeat": false, 
            "daysToRepeat": [
                 "dayOfWeek": 0, "repeat": false ,
                 "dayOfWeek": 1, "repeat": false ,
                 "dayOfWeek": 2, "repeat": false ,
                 "dayOfWeek": 3, "repeat": false ,
                 "dayOfWeek": 4, "repeat": false ,
                 "dayOfWeek": 5, "repeat": false ,
                 "dayOfWeek": 6, "repeat": false 
            ],
        ) 
        alarmModel.sortModel()
      

    onRejected: alarmDialog.close()


    contentItem: RowLayout 
        RowLayout 
            id: rowTumbler

            Tumbler 
                id: hoursTumbler
                model: 24
                delegate: TumblerDelegate 
                    text: formatNumber(modelData)
                
            
            Tumbler 
                id: minutesTumbler
                model: 60
                delegate: TumblerDelegate 
                    text: formatNumber(modelData)
                
            
        

        RowLayout 
            id: datePicker

            Layout.leftMargin: 20

            property alias dayTumbler: dayTumbler
            property alias monthTumbler: monthTumbler
            property alias yearTumbler: yearTumbler

            readonly property var days: [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]

            Tumbler 
                id: dayTumbler

                function updateModel() 
                    // Populate the model with days of the month. For example: [0, ..., 30]
                    var previousIndex = dayTumbler.currentIndex
                    var array = []
                    var newDays = datePicker.days[monthTumbler.currentIndex]
                    for (var i = 1; i <= newDays; ++i)
                        array.push(i)
                    dayTumbler.model = array
                    dayTumbler.currentIndex = Math.min(newDays - 1, previousIndex)
                

                Component.onCompleted: updateModel()

                delegate: TumblerDelegate 
                    text: formatNumber(modelData)
                
            
            Tumbler 
                id: monthTumbler

                onCurrentIndexChanged: dayTumbler.updateModel()

                model: 12
                delegate: TumblerDelegate 
                    text: window.locale.standaloneMonthName(modelData, Locale.ShortFormat)
                
            
            Tumbler 
                id: yearTumbler

                // This array is populated with the next three years. For example: [2021, 2022, 2023, 2024]
                readonly property var years: (function() 
                    var currentYear = new Date().getFullYear()
                    return [0, 1, 2, 3].map(function(value)  return value + currentYear ; )
                )()

                model: years
                delegate: TumblerDelegate 
                    text: formatNumber(modelData)
                

            

        
    


【问题讨论】:

【参考方案1】:

我真的不打算回答,但是“添加评论”链接似乎坏了(可能是我的旧 WinXP 浏览器)。 你看过“声音”QML 类型吗? (https://doc.qt.io/qt-5/qml-qtaudioengine-sound.html) 还是 SoundEffect QML 类型? (https://doc.qt.io/qt-5/qml-qtmultimedia-soundeffect.html#details)。 他们只需要您提供一个 .wav 文件。

【讨论】:

以上是关于如何添加警报声音(音频)?的主要内容,如果未能解决你的问题,请参考以下文章

在 AudioQueue 录制时播放警报声音(振动)

iOS 推送通知 - 如何在没有声音的情况下指定警报和徽章?

iPhone:如何独立于音量设置大声播放本地通知声音?

如何暂停 iPad 上的所有声音通知?

如何正确设置 MediaPlayer 音频流类型

如何获取警报声音列表