© (c) 2004, 2005 Yoni Rabkin, Jorgen Schaefer, Mario Domgoergen

     Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.1 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.  A copy of the license is included in the section entitled "GNU Free Documentation License".

Emms Manual
***********

This is the Manual for the Emacs Multimedia System

     [file gpl.texi not included]
     [file fdl.texi not included]

Introduction
************

Emms is the Emacs Multi-Media System. It tries to be a clean and small application to play multimedia files from Emacs using external players. Many of its ideas are derived from MpthreePlayer (http://www.nongnu.org/mp3player), but it tries to be more general and more clean.

The basic functionality of Emms consists of three parts: The core, the sources, and the players.

The core resides in emms.el, and provides a simple playlist and the basic functionality to use all the other features of Emms. It provides the common user commands and interfaces for other parts. It thinks in tracks, where a track is the combination of a type and a name - e.g. the track type 'file has a name that is the file name. Other track types are possible.

To get to tracks, the core needs sources. The file emms-source-file.el provides simple sources to interact with the file system.

When Emms finally has the sources in the playlist, it needs a player to play them. emms-player-simple.el defines a few useful players, and allows you to define your own in a very simple way.

The way Emms works is easy to customize with your own code or by using `M-x customize'. It is possible to extend Emms with the extra modules shipped with Emms. See Extending Emms.

Installation
************

You need to put all the .el files of emms in a directory in your load-path. For example, if you put all those files into ~/elisp/emms/, then in your ~/.emacs, you should do:

     (add-to-list 'load-path "~/elisp/emms/")

Compiling Emms
==============

You can byte-compile Emms by first entering the directory containing the Emms source code, followed by invoking:

make

Which will byte compile Emms. You can then invoke:

make install

Which will install Emms into your Emacs directories (provided you have the appropriate permissions to do so on your system).

Note that Emms is a light-weight and agile program, you can therefore run Emms just fine without byte compiling it.

Quick setup
***********

Emms is quite simple to set up. For the most basic needs, you will just need the following line,

     (require 'emms)

which installs the core of Emms.

Now we need to do some configuration.

The Emms module `emms-default' provides the function `emms-setup', which is a way to quickly configure your Emms. You can add any number of directories which contain media. The first argument is the complexity level of the user interface. Here's an example:

     (require 'emms-default)
     (emms-setup 'tiny "directory")

Here is a list of the interface complexity options:

minimalistic
     Define the players and play directory but nothing more.

tiny
     Features the above plus the playlist buffer mode. Use this for a minimalistic installation plus a user interface to the playlists.

default
     Features the above plus the reading the info from tagged Mp3 and Ogg files.

advanced

cvs

Now your configuration is done.

The (optional) directory is used for `emms-source-file-default-directory', in case you were wondering.

Configuration Example
*********************

The following code fragment provides a minimal EMMS setup without using the layer of `emms-default'. It can maybe be used to better understand the internals of EMMS. You can see how EMMS needs to know about players (these are defined in `emms-player-simple') and about sources for tracks (trivial file system based sources, such as this `emms-directory-tree', are defined in `emms-source-file').

     (require 'emms-player-simple)
     (require 'emms-source-file)
     (setq emms-player-list '(emms-player-mpg321
                              emms-player-ogg123
                              emms-player-mplayer))

For a discussion on how to define additional players, see Simple Players.

Much of the behaviour of Emms can be changed by setting variables. Here is an example. The first `setq' turns off the asynchronous updating of info tags. The second sets the default name of the Emms playlist buffer.

     (setq emms-info-asynchronously nil)
     (setq emms-playlist-buffer-name "*Music*")

Another way to change Emms variables is to use the M-x customize mechanism provided by Emacs.

Basic Commands
**************

Before you can use the interface commands, you need a playlist to start with. The following commands allow you to add to the current playlist from different sources:

Note that the commands with the ``emms-add-'' prefix add the source to the playlist but do not start playing it immediately. Conversely, the commands with the ``emms-play-'' prefix begin playing the track immediately.

 -- Function: emms-play-file file
     A source for a single file - either FILE, or queried from the user.

 -- Function: emms-add-file file
     A source for a single file - either FILE, or queried from the user.

 -- Function: emms-play-directory dir
     A source for a whole directory tree - either DIR, or queried from the user.

 -- Function: emms-add-directory dir
     A source for a whole directory tree - either DIR, or queried from the user.

 -- Function: emms-play-directory-tree dir
     A source for multiple directory trees - either DIR, or the value of EMMS-SOURCE-FILE-DEFAULT-DIRECTORY.

 -- Function: emms-add-directory-tree dir
     A source for multiple directory trees - either DIR, or the value of EMMS-SOURCE-FILE-DEFAULT-DIRECTORY.

 -- Function: emms-play-url url
     A source for an URL - for example, for streaming.

 -- Function: emms-add-url url
     A source for an URL - for example, for streaming.

 -- Function: emms-play-m3u-playlist playlist
     A source for the M3u playlist format from the file PLAYLIST.

 -- Function: emms-add-m3u-playlist playlist
     A source for the M3u playlist format from the file PLAYLIST.

 -- Function: emms-play-find dir regexp
     A source that will find files in DIR or EMMS-SOURCE-FILE-DEFAULT-DIRECTORY which match REGEXP.

 -- Function: emms-add-find dir regexp
     A source that will find files in DIR or EMMS-SOURCE-FILE-DEFAULT-DIRECTORY which match REGEXP.

The basic functionality of Emms is just to play music without being noticed. It provides a few commands to skip the current track and such, but other than that it doesn't show up. Emms provides the following basic user commands (which you might want to bind to keystrokes):

 -- Function: emms-start
     Start playing the current playlist

 -- Function: emms-stop
     Stop playing

 -- Function: emms-next
     Start playing the next track in the playlist

 -- Function: emms-previous
     Start playing previous track in the playlist

 -- Function: emms-shuffle
     Shuffle the current playlist. This uses EMMS-PLAYLIST-SHUFFLE-FUNCTION.

 -- Function: emms-sort
     Sort the current playlist. This uses EMMS-PLAYLIST-SORT-FUNCTION.

 -- Function: emms-show &optional insertp
     Describe the current Emms track in the minibuffer. If INSERTP is non-nil, insert the description into the current buffer instead.

The Core File
*************

The file emms.el provides all basic functions for playing music, generating a playlist and defining players.

 -- User Option: emms-player-list
     A list of players Emms can use. You need to set this in order to play files. Unless you use emms-player-simple you have to define a player with emms-define-player first.

 -- User Option: emms-show-format
     The format to use for emms-show. The only argument %s is the string returned by emms-track-description

 -- User Option: emms-repeat-playlist
     Non-nil for repeating the playlist after playing the last track.

 -- User Option: emms-track-description-function
     A function to be called to give a nice, user-friendly description of the track passed to it as an argument.

 -- User Option: emms-sort-lessp-function
     A function that compares two tracks, and returns non-nil if the first track should be sorted before the second (see `sort').

 -- User Option: emms-playlist-changed-hook
     A hook run when the playlist of Emms has changed.

 -- User Option: emms-playlist-current-changed-hook
     A hook run when the current track in the playlist of Emms has changed.

 -- User Option: emms-player-started-hook
     A hook run when an Emms player started playing.

 -- User Option: emms-player-stopped-hook
     A hook run when an Emms player stopped playing.

 -- Function: emms-next-noerror
     Play the next track in the playlist, but don't signal an error when we're at the end. This should be called when no player is playing. This is a suitable function to put in EMMS-PLAYER-STOPPED-HOOK.

 -- Function: emms-sort
     Sort the playlist.

 -- Function: emms-sort-track-name-less-p a b
     Return non-nil if the track name of A is before B.

 -- Function: emms-track type name
     Create a track with type TYPE and name NAME.

 -- Function: emms-track-type track
     Return the type of TRACK.

 -- Function: emms-track-name track
     Return the name of TRACK.

 -- Function: emms-track-get name track &optional inexistent
     Return the value of NAME for TRACK. If there is no value, return INEXISTENT (or nil if not given).

 -- Function: emms-track-set track name value
     Set the value of NAME for TRACK to VALUE.

 -- Function: emms-track-description track
     A simple function to give a user-readable description of TRACK. If it's a file track, it's just the filename. Else it's the type and the name with a colon in between.

 -- Function: emms-playlist-current
     Return a description of the currently playing track. This uses EMMS-TRACK-DESCRIPTION-FUNCTION.

 -- Function: emms-playlist-current-track
     Return the currently playing track.

 -- Function: emms-playlist-get n
     Return a description of the Nth entry of the current playlist. This uses `emms-track-description-function'

 -- Function: emms-playlist-get-track n
     Return the Nth track of the current playlist.

 -- Function: emms-playlist-set-playlist new
     Set the playlist to NEW. This runs `emms-playlist-changed-hook'.

 -- Function: emms-playlist-get-playlist
     Return the current playlist.

 -- Function: emms-playlist-set-current n
     Set the current track in the playlist to N (a number). This runs `emms-playlist-current-changed-hook'.

 -- Function: emms-playlist-get-current
     Return the number of the current track, or nil if the playlist is empty.

 -- Function: emms-playlist-next
     Advance the current track to the next entry in the playlist and return non-nil. Return nil if there is no next track.

 -- Function: emms-playlist-previous
     Set the current track to the previous entry in the playlist and return non-nil. Return nil if there is no previous track.

 -- Function: emms-playlist-add seq &optional idx
     Add each track of the sequence SEQ to the current playlist. Insert at IDX, which defaults to the end.

 -- Function: emms-playlist-remove idx
     Remove track at IDX from playlist.

 -- Function: emms-playlist-shuffle
     Shuffle the current playlist.

 -- Function: emms-playlist-sort
     Sort the current playlist according to `emms-sort-lessp-function'

 -- Function: emms-playlist-shuffle-vector vector
     Shuffle VECTOR.

 -- Function: emms-playlist-sort-vector vector
     Sort VECTOR according to `emms-sort-lessp-function'.

 -- Function: emms-source-play lis
     Play the tracks returned by LIS.

 -- Function: emms-player-for track
     Return the player which is responsible for TRACK, or nil if there is none.

 -- Function: emms-player-start track
     Start playing TRACK.

 -- Function: emms-player-stop
     Stop the currently playing player.

 -- Function: emms-player-stopped
     Declare that the current player has finished playing. This should only be called by a player.

Sources
*******

 -- User Option: emms-source-file-default-directory
     The default directory to look for media files.

 -- Function: emms-play-find
     Play all files in EMMS-SOURCE-FILE-DEFAULT-DIRECTORY that match a specific regular expression.

 -- Function: emms-play-dired
     Play marked files from the current dired buffer

 -- Function: emms-play-playlist
     Play all files from a playlist file.

 -- Function: emms-source-file &optional file
     An Emms source for a single file - either FILE, or queried from the user.

 -- Function: emms-source-files files
     An Emms source for a list of FILES.

 -- Function: emms-source-directory &optional dir
     An Emms source for a whole directory tree - either DIR, or queried from the user

 -- Function: emms-source-directory-tree & optional dir
     An Emms source for multiple directory trees - either DIR, or the value of EMMS-SOURCE-FILE-DEFAULT-DIRECTORY.

 -- Function: emms-source-find &optional dir regex
     An Emms source that will find files in DIR or EMMS-SOURCE-FILE-DEFAULT-DIRECTORY that match REGEXP.

 -- Function: emms-source-file-directory-tree &optional dir
     Return a list of all files under DIR that match REGEX.

 -- Function: emms-source-playlist-file file
     Return all files from playlist FILE.

 -- Function: emms-source-dired
     Play all marked files of a dired buffer

 -- Function: emms-source-file-regex
     Return a regexp that matches everything any player (that supports files) can play.

 -- Function: emms-save-playlist filename
     Export the current playlist as to FILENAME.  See also emms-source-playlist-file.

 -- Function: emms-locate
     Search for REGEXP and display the results in a locate buffer

Simple Players
**************

 -- Macro: define-emms-simple-player
     Returns a simple player with the use of emms-define-player. NAME is used to construct the name of the function like emms-player-NAME. REGEX must be a regexp that matches the filenames the player can play. COMMAND specifies the command line argument to call the player and ARGS are the command line arguments.

 -- Function: emms-player-simple-stop
     Stop the currently playing process, if indeed there is one

 -- Function: emms-player-simple-start
     Starts a process playing FILENAME using the specified CMDNAME with the specified PARAMS.

 -- Function: emms-player-simple-sentinel
     Sentinel for determining the end of process

Info Tags
*********

The file emms-info.el provides an interface for different methods of reading info about the files that Emms is playing, and displaying it.

To create a method for retrieving info about a file, you create an object like this:

     (define-emms-info-method emms-info-mp3info
       :providep 'emms-info-mp3info-providep
       :get 'emms-info-mp3info-get
       :set 'emms-info-mp3info-set)

Then you register it with emms-info, by adding it to EMMS-INFO-METHODS-LIST.

If you wish to use 'emms-info-mp3info' you will need the mp3info program which is available at http://www.ibiblio.org/mp3info/. Otherwise Emms will display an error when you attempt to access MP3 info.

     (add-to-list 'emms-info-methods-list 'emms-info-mp3info)

There are already two predefined methods for retrieving info

 -- Function: emms-info-get-cached track
     Return cached info for the track TRACK, nil of no cache.

 -- Function: emms-info-set-cached
     Set cached info for TRACK to INFO

 -- Function: emms-info-method-for track
     Return an info-method suitable for TRACK.

 -- Function: emms-info-get track &optional dont-use-cached
     Return an emms-info structure representing the track TRACK. if DONT-USE-CACHED is non-nil, then always read from the file.

 -- Function: emms-info-get-multiple callback tracks &optional dont-use-cached
     Asynchronously get all info tags from the tracks in the listlaw TRACKS. For each file, call CALLBACK with the track and the info structure.

 -- Function: emms-info-set track info
     Set the info of the file TRACK to the emms-info structure INFO.

 -- Function: emms-info-file-info-song-artist track
     Returns a description of TRACK, build from it's comments.

     If EMMS-INFO-METHODS-LIST indicates how to retrieve special info about it, use this. Otherwise returns the name alone.

 -- User Option: emms-info-methods-list
     List of info-methods. You need to set this!

 -- User Option: emms-info-cache
     Boolean value, indicating whether or not to use a cache for info-structures.

 -- User Option: emms-info-get-multiple-idletime
     The number of seconds emacs should be idle to get the next info. Increase this if emacs becomes unresponsive when building the playlist.

Ogg Info
========

The file emms-info-ogg.el provides an interface to retrieving comments from ogg-files, using Lawrence Mitchells ogg-comment.el.

To activate, put something like this in your ~/.emacs:

     (require 'emms-info-ogg)
     (add-to-list 'emms-player-alist
                  '("\\.ogg$" . emms-info-ogg-comments))

Of course, you'll also need a player if you want to actually play the files.

 -- Function: emms-info-ogg-comment-providep
     Return non-nil if this info-method provides info for the track.

 -- Function: emms-info-ogg-get-comment

 -- Function: emms-info-ogg-comment-get
     Retrieve an emms-info structure as an ogg-comment

MP3 Info
========

This code has been adapted from code found in mp3player.el, written by Jean-Philippe Theberge jphiltheberge@videotron.ca, Mario Domgoergen kanaldrache@gmx.de and Jorgen Schäfer forcer@forcix.cx

To activate this method for getting info, use something like:

     (require 'emms-info-mp3info)
     (add-to-list 'emms-info-methods-alist
                  '("\\.mp3$" . emms-info-mp3info))

Of course, you'll also need a player if you want to actually play the files.

 -- Function: emms-info-mp3info-providep
     Return non-nil if this info-method provides info for the track.

 -- Function: emms-info-mp3info-set track info
     Set the id3v1 tag of file TRACK to id3info INFO, using the MP3INFO-PROGRAM.

 -- Function: emms-info-mp3info-get track
     Get the id3v1 tag of file TRACK, using the mp3info-program and return an emms-info structure representing it.

 -- User Option: emms-info-mp3info-program-name
     *The name/path of the mp3info-program.

The Playlist Buffer
*******************

Playlist buffer
===============

emms-pbi
     Switch to playlist buffer

     The playlist-buffer *Playlist* will be created and put into emms-pbi-mode, which give you some usefull keybinings

?
     Describe the keybindings

<mouse-2>
     Play the current line

RET
     Play the current line

q

Q
     Stops emms and kill the playlist buffer

f
     Show the trackname on current line

s
     Stop Emms

C-y
     Yank a filename from EMMS-KILL-RING into the playlist.

C-k
     Kill the current line from the playlist.

     Send the filename to the EMMS-KILL-RING. Make sure hooks that regenerate the entire playlist aren't run.

c
     Center on current playing track

p
     Play the previous track in the playlist.

n
     Play the next track in the playlist. This might behave funny in EMMS-PLAYER-STOPPED-HOOK, use EMMS-NEXT-NOERROR instead for that.

C-x C-s
     Export the current playlist as to FILENAME. See also: EMMS-PBI-IMPORT-PLAYLIST.

 -- Function: emms-pbi
     Turn on emms-playlist if prefix argument ARG is a positive integer, off otherwise.

 -- Function: emms-pbi-shorten-entry-to-max-length
     Cut off an entry-text to make sure it's no longer than `emms-pbi-playlist-entry-max-length' characters long.

 -- Function: emms-pbi-entry-info-updated
     Update the track-entry based on the info

 -- Function: emms-pbi-rebuild-playlist-buffer
     This function rebuilds the playlist-buffer if necessary.

 -- Function: emms-pbi-build-playlist-buffer
     Build a playlist-buffer based on the current playlist.

 -- Function: emms-pbi-insert-tag
     Insert the TRACK tag at point. The tag is automatically shortened by emms-pbi-shorten-entry-to-max-length'.

 -- Function: emms-pbi-insert-entry
     Insert an entry in the playlist

 -- Function: emms-pbi-async-alternative-text filename
     Generates a single replacement-text for FILENAME, to be displayed in the playlist while the info is being loaded.

 -- Function: emms-pbi-update-current-face
     Updates the file line with the current-face

 -- Function: emms-pbi-add-properties-current-line
     Adds the correct faces and other properties to the current line

 -- Function: emms-pbi-play-current-line
     Play the current line

 -- Function: emms-pbi-show-current-line
     Show filename and info for track on current line.

 -- Function: emms-pbi-export-playlist filename
     Export the current playlist as to FILENAME.

 -- Function: emms-pbi-quit
     Stops emms and kill the playlist buffer

 -- Function: emms-pbi-kill-line
     Kill the current line from the playlist.

     Send the filename to EMMS-KILL-RING. Make sure hooks that regenerate the entire playlist aren't run.

 -- Function: emms-pbi-yank
     Yank a filename from `kill-ring' into the playlist.

 -- Function: emms-pbi-return-current-line-index
     Return the index position in the playlist of the current line.

 -- Function: emms-pbi-recenter
     Center on current playing track

 -- User Option: emms-pbi-playlist-entry-generate-function
     The function to call for generating a single item of the playlist. This will be called with a string argument FILENAME, and should return the text to be inserted in the playlist.

 -- User Option: emms-pbi-playlist-entry-max-length
     The maximum length of an entry in the playlist. If this is nil, the entire string provided by `emms-track-description-function'.  will be used. Beware, the output of that function is cut off to fit the max-length before running `emms-pbi-playlist-entry-generate-function'.

 -- User Option: emms-pbi-async-alternative-text-function
     The function to call for generating the replacement-text for a playlist-item, while the info is lazy-loading. This will be called with a string argument FILENAME, and should return the text to be processed by emms-pbi-playlist-entry-generate-function.

 -- User Option: emms-pbi-playlist-buffer-name
     Name of the buffer to use as a playlist-buffer

 -- User Option: emms-pbi-load-info-async
     Whether or not to use emms-info.el's features for async loading info. Defaults to t when emms-info is available, and nil otherwise.

 -- User Option: emms-pbi-after-build-hook
     Hook that is run after the playlist buffer is built. That might be usefull to change the playlist buffer before the buffer is set read-only.

 -- User Option: emms-pbi-current-line-face-changed-hook
     Hook that is called when the face of the current line changes.

 -- User Option: emms-pbi-manually-change-song-hook
     Hook that is called when the song is manually changed.

Extending Emms
**************

Emms introduces a high abstraction layer for playing music so you can customise a lot of things to morph Emms into your media player.

New Player
==========

The file emms-player-simple.el defines some easy players to start with, but it shouldn't be hard to provide a function for your favourite player. We will start with an easy example that shows how we can use the play command under Unix to play our WAV files.

Simple Player for play
----------------------

Play is a very easy command line player for various format. If you want your emms to play WAV files just put the following lines in you .emacs:

     (require 'emms-player-simple)
     (define-emms-simple-player play '(file) "\\.wav$" "play")

Huh! Wasn't that easy?

The macro function define-emms-simple-player takes a minimum of three arguments. The first argument (play in our example) defines the name of the player. It's used to name the player functions. The second is a regexp, that defines which files to play with our player. \\.wav$ matches any filename ending with a dot and the string wav. The last argument is the actual command line command we use to play our files. You can also add the path but we just assume that the command is in your path. All arguments you add to these three are optional. They define the command line arguments you want to add to your argument. If you want to hear the wav file of your favourite artist in the most possible volume use the following line:

     (require 'emms-player-simple)
     (define-emms-simple-player play '(file) "\\artist-*.wav$" "play" "--volume=100")

Please notice that you have to add the arguments as strings!

The command line tool you use for define-emms-simple-player has to take one song as argument and stop after playing that particular song. For any other concept you will need to customise emms a bit more...

More Complex Player
-------------------

The most players you use will be simple players so you don't need to read this chapter. But if you are curious how you can use (almost) every player in emms read further...

In this chapter we will use mpg321 to construct a player that actually can pause a track, restart it and show rest time. We won't implement all of that, but after that chapter you will know how to define it.

The command define-emms-simple-player is just a abstraction layer for define-emms-player, which is a little bit more complicated but much more powerful!

     (define-emms-player "emms-mpg321-remote"
       :start 'emms-mpg321-remote-start
       :stop 'emms-mpg321-remote-stop
       :playablep 'emms-mpg321-remote-playable-p)

So, that almost all! define-emms-player takes a minimum of three arguments. The first is the name of the player. The rest are methods with functions to call. Three methods are required: start, stop and playable. Start says Emms how to start a track (sic!), stop how to stop a player and playablep should return non-nil if the player can play the track.

So we just need these three functions to get our mpg321-remote:

First we code the start function. We will check if there's a open process and start one otherwise. Then we send a string to the process with the filename and set a filter.

     (defun emms-mpg321-remote-start ()
       (unless (get-process "mpg321-remote")
         (setq emms-mpg321-remote-process
     	  (start-process "mpg321-remote-process"
     			 "*mpg321*" "mpg321" "-R" "abc"))
       (process-send-string "mpg321-remote-process"
     		       (concat "l " (emms-track-name track)))
       (set-process-filter emms-mpg321-remote-process 'emms-mpg321-remote-filter)))

We need the filter, as mpg321-remote won't quit after playing the track as the simple player do. We wait until the process send the output ``@P 0'' (the signal of mpg321 that the song ended) to the filter and call emms-mpg321-remote-stop.

     (defun emms-mpg321-remote-filter (process output)
       (when (string-match "@P 0" output)
         (emms-mpg321-remote-stop)))

emms-mpg321-remote-stop won't do anything interesting. It just test if there are other files to play and close the process otherwise.

     (defun emms-mpg321-remote-stop ()
       (unless emms-playlist
         (process-send-string "mpg321-remote-process" "Q\n"))

And to make that a playable example i also added emms-mpg321-remote-playablep, which i just really steal from emms-player-simple.el

     (defun emms-mpg321-remote-playablep (track)
            "Return non-nil when we can play this track."
            (and (eq 'file (emms-track-type track))

Now we have a ready player and we could add commands like emms-mpg321-remote-pause for example.

Streaming Audio
***************

Emms provides a friendly interface for managing and playing streaming audio in addition to the Emms playlist interface. The interface is defined in the emms-streams.el package and can be loaded by invoking:

     (require 'emms-streams)

Enter the emms-streams interface by invoking M-x emms-streams. The emms-streams interface comes with a built-in, eclectic list of streaming audio channels from thoughout the Web. Emms can of-course play other streams than the ones listed by default, you are free to remove any or all of them and add your own. (If you enjoy a particular streaming audio station on the Web and think that it belongs in the default list, please send us a link and we will gladly add it!)

The following is a list of the key-bindings for the emms-streams interface:

RET
     Perform the default action when you press RET in the EMMS Stream interface.  Can be either ``add'' or ``play''. The default is ``add'', which adds the station under point to the Emms playlist. When EMMS-STREAM-DEFAULT-ACTION is ``play'' then Emms will play the streaming audio channel under point.

q
     Quit the emms-streams interface.

a
     Add a bookmark to a streaming audio URL to the list.

d
     Remove a bookmark to a streaming audio URL from the list.

e
     Edit the details of the bookmark under point.

h
     Describe the emms-streams mode.

n
     Move to the next line in the emms-streams buffer (same as C-n).

p
     Move to the previous line in the emms-streams buffer (same as C-p).

s
     Save the bookmarks in the emms-streams interface to disk. The bookmarks will be to the location designated in the variable EMMS-STREAM-BOOKMARKS-FILE.

i
     Return information about the streaming audio at the URL of the bookmark under point. Note that this will only work if the `emms-stream-info' has already been loaded.