Playing system sound without importing your own

后端 未结 10 2157
情深已故
情深已故 2020-11-27 02:26

Is it possible to play already existing system sounds without importing your own?

10条回答
  •  萌比男神i
    2020-11-27 03:12

    For swift, you can have a look at complete list of system sounds and ringtones example.

    Edit: Ok, here are the most important peaces of code from this example:

        ///The directories where sound files are located.
        let rootSoundDirectories: [String] = ["/Library/Ringtones", "/System/Library/Audio/UISounds"]
    
        ///Array to hold directories when we find them.
        var directories: [String] = []
    
        ///Tuple to hold directories and an array of file names within.
        var soundFiles: [(directory: String, files: [String])] = []
    
        //Starting with the "/Library/Ringtones" & "/System/Library/Audio/UISounds" directories, it looks for other sub-directories just one level lower and saves their relative path in directories array.
        //- URLs: All of the contents of the directory (files and sub-directories).
        func getDirectories() {
            let fileManager: NSFileManager = NSFileManager()
            for directory in rootSoundDirectories {
                let directoryURL: NSURL = NSURL(fileURLWithPath: "\(directory)", isDirectory: true)
    
                do {
                    if let URLs: [NSURL] = try fileManager.contentsOfDirectoryAtURL(directoryURL, includingPropertiesForKeys: [NSURLIsDirectoryKey], options: NSDirectoryEnumerationOptions()) {
                        var urlIsaDirectory: ObjCBool = ObjCBool(false)
                        for url in URLs {
                            if fileManager.fileExistsAtPath(url.path!, isDirectory: &urlIsaDirectory) {
                                if urlIsaDirectory {
                                    let directory: String = "\(url.relativePath!)"
                                    let files: [String] = []
                                    let newSoundFile: (directory: String, files: [String]) = (directory, files)
                                    directories.append("\(directory)")
                                    soundFiles.append(newSoundFile)
                                }
                            }
                        }
                    }
                } catch {
                    debugPrint("\(error)")
                }
            }
        }
    
        //For each directory, it looks at each item (file or directory) and only appends the sound files to the soundfiles[i]files array.
        //- URLs: All of the contents of the directory (files and sub-directories).
            func loadSoundFiles() {
                for i in 0...directories.count-1 {
                    let fileManager: NSFileManager = NSFileManager()
                    let directoryURL: NSURL = NSURL(fileURLWithPath: directories[i], isDirectory: true)
    
                    do {
                        if let URLs: [NSURL] = try fileManager.contentsOfDirectoryAtURL(directoryURL, includingPropertiesForKeys: [NSURLIsDirectoryKey], options: NSDirectoryEnumerationOptions()) {
                            var urlIsaDirectory: ObjCBool = ObjCBool(false)
                            for url in URLs {
                                if fileManager.fileExistsAtPath(url.path!, isDirectory: &urlIsaDirectory) {
                                    if !urlIsaDirectory {
                                        soundFiles[i].files.append("\(url.lastPathComponent!)")
                                    }
                                }
                            }
                        }
                    } catch {
                        debugPrint("\(error)")
                    }
                }
            }
    

    The example shows the system sound files in a table view. Sounds are played as shown in this function:

    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
            //Play the sound
            let directory: String = soundFiles[indexPath.section].directory
            let fileName: String = soundFiles[indexPath.section].files[indexPath.row]
            let fileURL: NSURL = NSURL(fileURLWithPath: "\(directory)/\(fileName)")
            do {
                model.audioPlayer = try AVAudioPlayer(contentsOfURL: fileURL)
                model.audioPlayer.play()
            } catch {
                debugPrint("\(error)")
            }
        }
    

    Where model.audioPlayer is just an instance of AVAudioPlayer:

    ///Audio player responsible for playing sound files.
    var audioPlayer: AVAudioPlayer = AVAudioPlayer()
    

提交回复
热议问题