A PCM device is, at its simplest, a data buffer that's converted, one sample at a
time, by either a Digital Analog Converter (DAC) or an Analog Digital Converter (ADC),
depending on direction.
This simple idea becomes a little more complicated in QSA because of
the concept that the PCM subchannel is in a state at any given moment.
These states are defined as follows:
- SND_PCM_STATUS_NOTREADY
 
- The initial state of the device.
  
  
  
 
- SND_PCM_STATUS_READY
 
- The device has its parameters set for the data it will operate on.
  
  
  
 
- SND_PCM_STATUS_PREPARED
 
- The device has been prepared for operation and is able to run.
  
  
  
 
- SND_PCM_STATUS_RUNNING
 
- The device is running, transferring data to or from the buffer.
  
  
  
 
- SND_PCM_STATUS_UNDERRUN
 
- This state happens only to a playback device and is entered
  when the buffer has no more data to be played.
  
  
  
  
  
 
- SND_PCM_STATUS_OVERRUN
 
- This state happens only to a capture device and is entered
  when the buffer has no room for data.
  
  
  
  
  
 
- SND_PCM_STATUS_PAUSED
 
- The device is paused and is no longer playing the audio stream. To resume playing, you must
                    explicitly call the appropriate snd_pcm_*_resume() function.
                        
This state occurs when a user explicitly calls a
                            snd_pcm_*_pause() function. It can also occur because
                        the audio concurrency management policy in place has moved a subchannel that
                        was previously in the SND_PCM_STATUS_SUSPEND to the
                            SND_PCM_STATUS_PAUSED state. 
                    
                    
                    
                    
                 
        - SND_PCM_STATUS_SUSPENDED
 
        - Audio concurrency management has suspended the play of the audio stream based on the
                    current audio concurrency management policies that are configured on the system.
                    
                
 
         - SND_PCM_STATUS_SUSPENDED is a transient or temporary state that's
                    controlled by the audio concurrency management policies running on the system.
                    This transient state has two modes called soft suspended and hard
                        suspended.
                    
                    For more information about these modes and how they work, see the Understanding preemption section in the Audio Concurrency Management chapter of this guide. 
 
         
         - 
           
  
  
  
 
    
- SND_PCM_STATUS_UNSECURE
 
- The application marked the stream as protected, the hardware
  level supports a secure transport (e.g., HDCP for HDMI), and
  authentication was lost.
  
  
  
 
- SND_PCM_STATUS_ERROR
 
- A hardware error has occurred, and the stream must be prepared again.
  
  
  
 
- SND_PCM_STATUS_CHANGE
 
- The stream has changed and the audio stream must be reconfigured.
  
  
  
  
  
      When the subchannel is put into the SND_PCM_STATUS_CHANGE state,
      the client must reconfigure the audio stream as the hardware capabilities have
      changed. For example, for an HDMI connection, the audio mode of the HDMI source 
      (display, amplifier, etc.) may have changed from stereo to 5.1 surround sound,
      therefore, your subchannel must be reconfigured to enable the voice conversion plugin.
  
    
      To reconfigure an audio stream, you must call
      snd_pcm_plugin_params()
      or snd_pcm_channel_params()
      and then the corresponding
      snd_pcm_plugin_setup()
      or snd_pcm_channel_setup()
      functions. If you want to check what new hardware capabilities are available,
      you can call snd_pcm_channel_info(),
          which gets information directly from the hardware.
  
  
      
      After you reconfigure the audio stream, then you can call
      snd_pcm_plugin_prepare()
      or snd_pcm_channel_prepare()
      to move to the SND_PCM_STATUS_PREPARED state and to continue writing
      audio data to the subchannel.
  
  Note: 
     The call to the snd_pcm_plugin_params() or
     snd_pcm_channel_params() functions may cause the fragment size to
     change. For that reason, ensure that after you make a snd_pcm_*_params() call, that you
     call the snd_pcm_*_setup() and snd_pcm_*_prepare() functions before you write your
     audio data.
  
  
 
- SND_PCM_STATUS_PREEMPTED
 
- Audio is blocked because another libasound session has initiated playback,
                    and the audio driver has determined that that session has higher priority, and
                    therefore the lower priority session is terminated with state
                        SND_PCM_STATUS_PREEMPTED. This state occurs only if there
                    aren't enough resources available on the system. When it receives this state,
                    the client should give up on playback, and not attempt to resume until either
                    the sound it wishes to produce has increased in priority, or a user initiates a
                    retry. 
Note: Don't confuse the SND_PCM_STATUS_PREEMPTED state
                        with the SND_PCM_STATUS_SUSPENDED state. When a subchannel
                        gets preempted because audio concurrency management has occurred, it moves
                        to SND_PCM_STATUS_SUSPENDED state. 
                    
                    
                    
                 
Figure 1. General state diagram for PCM devices. 
    In the figure above, the oval groups the Underrun/Overrun, Error, and Unsecure states
      together to indicate that each state can transition to the Prepared state.
The transition between states is the result of executing an API call, or the result of conditions
   that occur in the hardware. For more details, see the Playing and
   Capturing Audio Data chapter.