Index: src/mlx/acft.py
===================================================================
--- src/mlx/acft.py	(revision 271)
+++ src/mlx/acft.py	(revision 273)
@@ -122,4 +122,9 @@
         
         self._checkers.append(checks.ReverserChecker())
+
+        if flight.aircraftType is not None and config.enableApproachCallouts:
+            approachCallouts = flight.config.getApproachCallouts(flight.aircraftType)
+            if approachCallouts:
+                self._checkers.append(checks.ApproachCalloutsPlayer(approachCallouts))
 
         self._smoothedIAS = SmoothedValue()
Index: src/mlx/checks.py
===================================================================
--- src/mlx/checks.py	(revision 271)
+++ src/mlx/checks.py	(revision 273)
@@ -219,4 +219,29 @@
 #---------------------------------------------------------------------------------------
 
+class ApproachCalloutsPlayer(StateChecker):
+    """A state checker that plays a sequence of approach callouts.
+
+    It tracks the altitude during the descent and landing phases and
+    if the altitude crosses one that has a callout associated with and
+    the vertical speed is negative, that callout will be played."""    
+    def __init__(self, approachCallouts):
+        """Construct the approach callouts player."""
+        self._approachCallouts = approachCallouts
+        self._altitudes = approachCallouts.getAltitudes(descending = False)
+
+    def check(self, flight, aircraft, logger, oldState, state):
+        """Check if we need to play a callout."""
+        if (flight.stage==const.STAGE_DESCENT or \
+            flight.stage==const.STAGE_LANDING) and state.vs<0:
+            oldRadioAltitude = oldState.radioAltitude
+            radioAltitude = state.radioAltitude
+            for altitude in self._altitudes:
+                if radioAltitude<=altitude and \
+                   oldRadioAltitude>altitude:
+                    startSound(self._approachCallouts[altitude])
+                    break
+
+#---------------------------------------------------------------------------------------
+
 class StateChangeLogger(StateChecker):
     """Base class for classes the instances of which check if a specific change has
Index: src/mlx/config.py
===================================================================
--- src/mlx/config.py	(revision 270)
+++ src/mlx/config.py	(revision 273)
@@ -157,4 +157,14 @@
             index += 1
 
+    def getAltitudes(self, descending = True):
+        """Get the altitudes in decreasing order by default."""
+        altitudes = self._mapping.keys()
+        altitudes.sort(reverse = descending)
+        return altitudes
+
+    def __nonzero__(self):
+        """Return if there is anything in the mapping."""
+        return not not self._mapping
+
     def __eq__(self, other):
         """Determine if the approach callout mapping is equal to the given
@@ -172,21 +182,13 @@
 
     def __getitem__(self, altitude):
-        """Get the file that is associated with the highest altitude not higher
-        than the given one.
+        """Get the file that is associated with the given altitude.
 
         If no such file found, return None."""
-        candidate = None
-        for (alt, path) in self._mapping.iteritems():
-            if alt<=altitude:
-                if candidate is None or alt>candidate[0]:
-                    candidate = (alt, path)
-
-        return candidate
+        return self._mapping[altitude] if altitude in self._mapping else None
 
     def __iter__(self):
         """Iterate over the pairs of altitudes and paths in decreasing order of
         the altitude."""
-        altitudes = self._mapping.keys()
-        altitudes.sort(reverse = True)
+        altitudes = self.getAltitudes()
 
         for altitude in altitudes:
Index: src/mlx/pyuipc_sim.py
===================================================================
--- src/mlx/pyuipc_sim.py	(revision 243)
+++ src/mlx/pyuipc_sim.py	(revision 273)
@@ -552,4 +552,5 @@
         elif offset==0x0570:       # Altitude
             self.altitude = value / const.FEETTOMETRES / 65536.0 / 65536.0
+            self.radioAltitude = self.altitude - 517
         elif offset==0x0578:       # Pitch
             self.pitch = value * 360.0 / 65536.0 / 65536.0
@@ -668,4 +669,7 @@
             raise FSUIPCException(ERR_DATA)
         elif offset==0x31e4:       # Radio altitude
+            self.radioAltitude = value / const.FEETTOMETRES / 65536.0
+            self.altitude = self.radioAltitude + 517
+        elif offset==0x31e4:       # Radio altitude
             raise FSUIPCException(ERR_DATA)
         elif offset==0x320c:
Index: test/test1.txt
===================================================================
--- test/test1.txt	(revision 241)
+++ test/test1.txt	(revision 273)
@@ -25,8 +25,53 @@
 set altitude=557
 set ias=125 gs=125
+set radioAltitude=3200
+set radioAltitude=3100
+set radioAltitude=3000
+set radioAltitude=2900
+set radioAltitude=2800
+set radioAltitude=2700
+set radioAltitude=2600
+set radioAltitude=2521
+set radioAltitude=2510
+set radioAltitude=2500
+set radioAltitude=2500
+set radioAltitude=2499
+set radioAltitude=2520
+set radioAltitude=2400
+set radioAltitude=2300
+set radioAltitude=2200
+set radioAltitude=2100
+set radioAltitude=2018
+set radioAltitude=1950
+set radioAltitude=1800
+set radioAltitude=1600
+set radioAltitude=1550
+set radioAltitude=1450
+set radioAltitude=1590
+set radioAltitude=1499
+set radioAltitude=1400
+set radioAltitude=1300
+set radioAltitude=1200
+set radioAltitude=1200
+set radioAltitude=1100
+set radioAltitude=1001
+set radioAltitude=912
+set radioAltitude=832
+set radioAltitude=705
+set radioAltitude=599
+set radioAltitude=501
+set radioAltitude=412
+set radioAltitude=331
+set radioAltitude=241
+set radioAltitude=102
+set radioAltitude=90
 set noseGear=100
-set altitude=547
-set altitude=537
-set altitude=527
+set radioAltitude=80
+set radioAltitude=70
+set radioAltitude=60
+set radioAltitude=51
+set radioAltitude=42
+set radioAltitude=29
+set radioAltitude=9
 set altitude=517
 set latitude=47.49 longitude=21.62
