Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 56b7eeaa authored by The Android Open Source Project's avatar The Android Open Source Project
Browse files

manual merge f3af740b

Merge commit 'f3af740b'
parents 761daf75 f3af740b
Loading
Loading
Loading
Loading
+55 −0
Original line number Diff line number Diff line
@@ -70874,6 +70874,17 @@
 visibility="public"
>
</field>
<field name="TONE_SUP_CONFIRM"
 type="int"
 transient="false"
 volatile="false"
 value="32"
 static="true"
 final="true"
 deprecated="not deprecated"
 visibility="public"
>
</field>
<field name="TONE_SUP_CONGESTION"
 type="int"
 transient="false"
@@ -70885,6 +70896,17 @@
 visibility="public"
>
</field>
<field name="TONE_SUP_CONGESTION_ABBREV"
 type="int"
 transient="false"
 volatile="false"
 value="31"
 static="true"
 final="true"
 deprecated="not deprecated"
 visibility="public"
>
</field>
<field name="TONE_SUP_DIAL"
 type="int"
 transient="false"
@@ -70907,6 +70929,39 @@
 visibility="public"
>
</field>
<field name="TONE_SUP_INTERCEPT"
 type="int"
 transient="false"
 volatile="false"
 value="29"
 static="true"
 final="true"
 deprecated="not deprecated"
 visibility="public"
>
</field>
<field name="TONE_SUP_INTERCEPT_ABBREV"
 type="int"
 transient="false"
 volatile="false"
 value="30"
 static="true"
 final="true"
 deprecated="not deprecated"
 visibility="public"
>
</field>
<field name="TONE_SUP_PIP"
 type="int"
 transient="false"
 volatile="false"
 value="33"
 static="true"
 final="true"
 deprecated="not deprecated"
 visibility="public"
>
</field>
<field name="TONE_SUP_RADIO_ACK"
 type="int"
 transient="false"
+70 −19
Original line number Diff line number Diff line
@@ -18,7 +18,7 @@
#define ANDROID_TONEGENERATOR_H_

#include <utils/RefBase.h>
#include <utils/Vector.h>
#include <utils/KeyedVector.h>
#include <utils/threads.h>
#include <media/AudioSystem.h>
#include <media/AudioTrack.h>
@@ -49,21 +49,30 @@ public:
        TONE_DTMF_C,  // C key: 1633Hz, 852Hz
        TONE_DTMF_D,  // D key: 1633Hz, 941Hz
        // Call supervisory tones:  3GPP TS 22.001 (CEPT)
        TONE_SUP_DIAL,  // Dial tone: 425Hz, continuous
        TONE_SUP_BUSY,  // Busy tone: 425Hz, 500ms ON, 500ms OFF...
        TONE_SUP_CONGESTION,  // Congestion tone: 425Hz, 200ms ON, 200ms OFF...
        TONE_SUP_RADIO_ACK,  // Radio path acknowlegment: 425Hz, 200ms ON
        TONE_SUP_DIAL,  // Dial tone: CEPT: 425Hz, continuous
        FIRST_SUP_TONE = TONE_SUP_DIAL,
        TONE_SUP_BUSY,  // Busy tone, CEPT: 425Hz, 500ms ON, 500ms OFF...
        TONE_SUP_CONGESTION,  // Congestion tone CEPT, JAPAN: 425Hz, 200ms ON, 200ms OFF...
        TONE_SUP_RADIO_ACK,  // Radio path acknowlegment, CEPT, ANSI: 425Hz, 200ms ON
        TONE_SUP_RADIO_NOTAVAIL,  // Radio path not available: 425Hz, 200ms ON, 200 OFF 3 bursts
        TONE_SUP_ERROR,  // Error/Special info:  950Hz+1400Hz+1800Hz, 330ms ON, 1s OFF...
        TONE_SUP_CALL_WAITING,  // Call Waiting:  425Hz, 200ms ON, 600ms OFF, 200ms ON, 3s OFF...
        TONE_SUP_RINGTONE,  // Ring Tone:  425Hz, 1s ON, 4s OFF...
        TONE_SUP_CALL_WAITING,  // Call Waiting CEPT,JAPAN:  425Hz, 200ms ON, 600ms OFF, 200ms ON, 3s OFF...
        TONE_SUP_RINGTONE,  // Ring Tone CEPT, JAPAN:  425Hz, 1s ON, 4s OFF...
        LAST_SUP_TONE = TONE_SUP_RINGTONE,
        // Proprietary tones:  3GPP TS 31.111
        TONE_PROP_BEEP,  // General beep: 400Hz+1200Hz, 35ms ON
        TONE_PROP_ACK,  // Positive Acknowlgement: 1200Hz, 100ms ON, 100ms OFF 2 bursts
        TONE_PROP_NACK,  // Negative Acknowlgement: 300Hz+400Hz+500Hz, 400ms ON
        TONE_PROP_PROMPT,  // Prompt tone: 400Hz+1200Hz, 200ms ON
        TONE_PROP_BEEP2,  // General double beep: 400Hz+1200Hz, 35ms ON, 200ms OFF, 35ms on
        NUM_TONES
        // Additional call supervisory tones: specified by IS-95 only
        TONE_SUP_INTERCEPT, // Intercept tone: alternating 440 Hz and 620 Hz tones, each on for 250 ms.
        TONE_SUP_INTERCEPT_ABBREV, // Abbreviated intercept: intercept tone limited to 4 seconds
        TONE_SUP_CONGESTION_ABBREV, // Abbreviated congestion: congestion tone limited to 4 seconds
        TONE_SUP_CONFIRM, // Confirm tone: a 350 Hz tone added to a 440 Hz tone repeated 3 times in a 100 ms on, 100 ms off cycle.
        TONE_SUP_PIP, // Pip tone: four bursts of 480 Hz tone (0.1 s on, 0.1 s off).
        NUM_TONES,
        NUM_SUP_TONES = LAST_SUP_TONE-FIRST_SUP_TONE+1
    };

    ToneGenerator(int streamType, float volume);
@@ -85,13 +94,45 @@ private:
        TONE_RESTARTING  //
    };

    static const unsigned int TONEGEN_MAX_WAVES = 3;
    static const unsigned int TONEGEN_MAX_SEGMENTS = 4;  // Maximun number of elenemts in

    // Region specific tones.
    // These supervisory tones are different depending on the region (USA/CANADA, JAPAN, rest of the world).
    // When a tone in the range [FIRST_SUP_TONE, LAST_SUP_TONE] is requested, the region is determined
    // from system property gsm.operator.iso-country and the proper tone descriptor is selected with the
    // help of sToneMappingTable[]
    enum regional_tone_type {
        // ANSI supervisory tones
        TONE_ANSI_DIAL = NUM_TONES, // Dial tone: a continuous 350 Hz + 440 Hz tone.
        TONE_ANSI_BUSY,             // Busy tone on:  a 480 Hz + 620 Hz tone repeated in a 500 ms on, 500 ms off cycle.
        TONE_ANSI_CONGESTION,       // Network congestion (reorder) tone on:  a 480 Hz + 620 Hz tone repeated in a 250 ms on, 250 ms off cycle.
        TONE_ANSI_CALL_WAITING,     // Call waiting tone on: 440 Hz, on for 300 ms, 9,7 s off followed by
                                    // (440 Hz, on for 100 ms off for 100 ms, on for 100 ms, 9,7s off and repeated as necessary).
        TONE_ANSI_RINGTONE,         // Ring Tone:  a 440 Hz + 480 Hz tone repeated in a 2 s on, 4 s off pattern.
        // JAPAN Supervisory tones
        TONE_JAPAN_DIAL,            // Dial tone: 400Hz, continuous
        TONE_JAPAN_BUSY,            // Busy tone: 400Hz, 500ms ON, 500ms OFF...
        TONE_JAPAN_RADIO_ACK,       // Radio path acknowlegment: 400Hz, 1s ON, 2s OFF...
        NUM_ALTERNATE_TONES
    };

    enum region {
        ANSI,
        JAPAN,
        CEPT,
        NUM_REGIONS
    };

    static const unsigned char sToneMappingTable[NUM_REGIONS-1][NUM_SUP_TONES];

    static const unsigned int TONEGEN_MAX_WAVES = 3;     // Maximun number of sine waves in a tone segment
    static const unsigned int TONEGEN_MAX_SEGMENTS = 5;  // Maximun number of segments in a tone descriptor
    static const unsigned int TONEGEN_INF = 0xFFFFFFFF;  // Represents infinite time duration
    static const float TONEGEN_GAIN = 0.9;  // Default gain passed to  WaveGenerator().

    // ToneDescriptor class contains all parameters needed to generate a tone:
    //    - The array waveFreq[] contains the frequencies of all individual waves making the multi-tone.
    //    - The array waveFreq[]:
    //         1 for static tone descriptors: contains the frequencies of all individual waves making the multi-tone.
    //         2 for active tone descritors: contains the indexes of the WaveGenerator objects in mWaveGens
    //        The number of sine waves varies from 1 to TONEGEN_MAX_WAVES.
    //        The first null value indicates that no more waves are needed.
    //    - The array segments[] is used to generate the tone pulses. A segment is a period of time
@@ -101,16 +142,24 @@ private:
    //        The first segment encountered with a 0 duration    indicates that no more segment follows.
    //    - repeatCnt indicates the number of times the sequence described by segments[] array must be repeated.
    //        When the tone generator encounters the first 0 duration segment, it will compare repeatCnt to mCurCount.
    //        If mCurCount > repeatCnt, the tone is stopped automatically.
    //        If mCurCount > repeatCnt, the tone is stopped automatically. Otherwise, tone sequence will be
    //        restarted from segment repeatSegment.
    //    - repeatSegment number of the first repeated segment when repeatCnt is not null

    class ToneDescriptor {
    class ToneSegment {
    public:
        unsigned int duration;
        unsigned short waveFreq[TONEGEN_MAX_WAVES+1];
        unsigned long segments[TONEGEN_MAX_SEGMENTS+1];
    };

    class ToneDescriptor {
    public:
        ToneSegment segments[TONEGEN_MAX_SEGMENTS+1];
        unsigned long repeatCnt;
        unsigned long repeatSegment;
    };

    static const ToneDescriptor toneDescriptors[NUM_TONES];
    static const ToneDescriptor sToneDescriptors[];

    unsigned int mTotalSmp;  // Total number of audio samples played (gives current time)
    unsigned int mNextSegSmp;  // Position of next segment transition expressed in samples
@@ -121,6 +170,7 @@ private:
    unsigned short mCurSegment;  // Current segment index in ToneDescriptor segments[]
    unsigned short mCurCount;  // Current sequence repeat count
    volatile unsigned short mState;  // ToneGenerator state (tone_state)
    unsigned short mRegion;
    const ToneDescriptor *mpToneDesc;  // pointer to active tone descriptor
    const ToneDescriptor *mpNewToneDesc;  // pointer to next active tone descriptor

@@ -136,8 +186,9 @@ private:
    bool initAudioTrack();
    static void audioCallback(int event, void* user, void *info);
    bool prepareWave();
    unsigned int numWaves();
    unsigned int numWaves(unsigned int segmentIdx);
    void clearWaveGens();
    int getToneForRegion(int toneType);

    // WaveGenerator generates a single sine wave
    class WaveGenerator {
@@ -167,7 +218,7 @@ private:
        short mAmplitude_Q15;  // Q15 amplitude
    };

    Vector<WaveGenerator *> mWaveGens;  // list of active wave generators.
    KeyedVector<unsigned short, WaveGenerator *> mWaveGens;  // list of active wave generators.
};

}
+58 −8
Original line number Diff line number Diff line
@@ -130,25 +130,35 @@ public class ToneGenerator
     */
    public static final int TONE_DTMF_D = 15;
    /**
     * Call supervisory tone, Dial tone: 425Hz, continuous
     * Call supervisory tone, Dial tone:
     *      CEPT:           425Hz, continuous
     *      ANSI (IS-95):   350Hz+440Hz, continuous
     *      JAPAN:          400Hz, continuous
     *
     * @see #ToneGenerator(int, int)
     */
    public static final int TONE_SUP_DIAL = 16;
    /**
     * Call supervisory tone, Busy: 425Hz, 500ms ON, 500ms OFF...
     * Call supervisory tone, Busy:
     *      CEPT:           425Hz, 500ms ON, 500ms OFF...
     *      ANSI (IS-95):   480Hz+620Hz, 500ms ON, 500ms OFF...
     *      JAPAN:          400Hz, 500ms ON, 500ms OFF...
     *
     * @see #ToneGenerator(int, int)
     */
    public static final int TONE_SUP_BUSY = 17;
    /**
     * Call supervisory tone, Congestion: 425Hz, 200ms ON, 200ms OFF...
     * Call supervisory tone, Congestion:
     *      CEPT, JAPAN:    425Hz, 200ms ON, 200ms OFF...
     *      ANSI (IS-95):   480Hz+620Hz, 250ms ON, 250ms OFF...
     * 
     * @see #ToneGenerator(int, int)
     */
    public static final int TONE_SUP_CONGESTION = 18;
    /**
     * Call supervisory tone, Radio path acknowlegment : 425Hz, 200ms ON
     * Call supervisory tone, Radio path acknowlegment :
     *      CEPT, ANSI:    425Hz, 200ms ON
     *      JAPAN:         400Hz, 1s ON, 2s OFF...
     * 
     * @see #ToneGenerator(int, int)
     */
@@ -166,13 +176,17 @@ public class ToneGenerator
     */
    public static final int TONE_SUP_ERROR = 21;
    /**
     * Call supervisory tone, Call Waiting: 425Hz, 200ms ON, 600ms OFF, 200ms ON, 3s OFF...
     * Call supervisory tone, Call Waiting:
     *      CEPT, JAPAN:    425Hz, 200ms ON, 600ms OFF, 200ms ON, 3s OFF...
     *      ANSI (IS-95):   440 Hz, 300 ms ON, 9.7 s OFF, (100 ms ON, 100 ms OFF, 100 ms ON, 9.7s OFF ...)
     * 
     * @see #ToneGenerator(int, int)
     */
    public static final int TONE_SUP_CALL_WAITING = 22;
    /**
     * Call supervisory tone, Ring Tone: 425Hz, 1s ON, 4s OFF...
     * Call supervisory tone, Ring Tone:
     *      CEPT, JAPAN:    425Hz, 1s ON, 4s OFF...
     *      ANSI (IS-95):   440Hz + 480Hz, 2s ON, 4s OFF...
     * 
     * @see #ToneGenerator(int, int)
     */
@@ -207,6 +221,37 @@ public class ToneGenerator
     * @see #ToneGenerator(int, int)
     */
    public static final int TONE_PROP_BEEP2 = 28;
    /**
     * Call supervisory tone (IS-95), intercept tone: alternating 440 Hz and 620 Hz tones, each on for 250 ms
     *
     * @see #ToneGenerator(int, int)
     */
    public static final int TONE_SUP_INTERCEPT = 29;
    /**
     * Call supervisory tone (IS-95), abbreviated intercept: intercept tone limited to 4 seconds
     *
     * @see #ToneGenerator(int, int)
     */
    public static final int TONE_SUP_INTERCEPT_ABBREV = 30;
    /**
     * Call supervisory tone (IS-95), abbreviated congestion: congestion tone limited to 4 seconds
     *
     * @see #ToneGenerator(int, int)
     */
    public static final int TONE_SUP_CONGESTION_ABBREV = 31;
    /**
     * Call supervisory tone (IS-95), confirm tone: a 350 Hz tone added to a 440 Hz tone repeated 3 times in a 100 ms on, 100 ms off cycle
     *
     * @see #ToneGenerator(int, int)
     */
    public static final int TONE_SUP_CONFIRM = 32;
    /**
     * Call supervisory tone (IS-95), pip tone: four bursts of 480 Hz tone (0.1 s on, 0.1 s off).
     *
     * @see #ToneGenerator(int, int)
     */
    public static final int TONE_SUP_PIP = 33;


    /** Maximum volume, for use with {@link #ToneGenerator(int,int)} */
    public static final int MAX_VOLUME = AudioSystem.MAX_VOLUME;
@@ -258,6 +303,11 @@ public class ToneGenerator
     * <li>{@link #TONE_PROP_NACK}
     * <li>{@link #TONE_PROP_PROMPT}
     * <li>{@link #TONE_PROP_BEEP2}
     * <li>{@link #TONE_SUP_INTERCEPT}
     * <li>{@link #TONE_SUP_INTERCEPT_ABBREV}
     * <li>{@link #TONE_SUP_CONGESTION_ABBREV}
     * <li>{@link #TONE_SUP_CONFIRM}
     * <li>{@link #TONE_SUP_PIP}
     * </ul>
     * @see #ToneGenerator(int, int)
    */
+342 −85

File changed.

Preview size limit exceeded, changes collapsed.

+13 −1
Original line number Diff line number Diff line
@@ -75,6 +75,18 @@ import android.media.AudioManager;
          }
      }

      for (type = ToneGenerator.TONE_SUP_INTERCEPT;
      type <= ToneGenerator.TONE_SUP_PIP; type++) {
          if (toneGen.startTone(type)) {
              Thread.sleep(5000);
              toneGen.stopTone();
              Thread.sleep(200);
          } else {
              result = false;
              break;
          }
      }

      toneGen.release();
      return result;
    }