diff options
Diffstat (limited to 'core/java')
-rw-r--r-- | core/java/android/alsa/AlsaCardsParser.java | 186 | ||||
-rw-r--r-- | core/java/android/alsa/AlsaDevicesParser.java | 72 | ||||
-rw-r--r-- | core/java/android/hardware/usb/UsbDevice.java | 1 |
3 files changed, 181 insertions, 78 deletions
diff --git a/core/java/android/alsa/AlsaCardsParser.java b/core/java/android/alsa/AlsaCardsParser.java index 8b44881..8f9c56c 100644 --- a/core/java/android/alsa/AlsaCardsParser.java +++ b/core/java/android/alsa/AlsaCardsParser.java @@ -22,46 +22,58 @@ import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; -import java.util.Vector; +import java.util.ArrayList; /** * @hide Retrieves information from an ALSA "cards" file. */ public class AlsaCardsParser { private static final String TAG = "AlsaCardsParser"; + protected static final boolean DEBUG = true; - private static LineTokenizer tokenizer_ = new LineTokenizer(" :[]"); + private static LineTokenizer mTokenizer = new LineTokenizer(" :[]"); + + private ArrayList<AlsaCardRecord> mCardRecords = new ArrayList<AlsaCardRecord>(); public class AlsaCardRecord { + private static final String TAG = "AlsaCardRecord"; + private static final String kUsbCardKeyStr = "at usb-"; + public int mCardNum = -1; public String mField1 = ""; public String mCardName = ""; public String mCardDescription = ""; + public boolean mIsUsb = false; public AlsaCardRecord() {} public boolean parse(String line, int lineIndex) { int tokenIndex = 0; int delimIndex = 0; + if (lineIndex == 0) { // line # (skip) - tokenIndex = tokenizer_.nextToken(line, tokenIndex); - delimIndex = tokenizer_.nextDelimiter(line, tokenIndex); + tokenIndex = mTokenizer.nextToken(line, tokenIndex); + delimIndex = mTokenizer.nextDelimiter(line, tokenIndex); + + // mCardNum + mCardNum = Integer.parseInt(line.substring(tokenIndex, delimIndex)); // mField1 - tokenIndex = tokenizer_.nextToken(line, delimIndex); - delimIndex = tokenizer_.nextDelimiter(line, tokenIndex); + tokenIndex = mTokenizer.nextToken(line, delimIndex); + delimIndex = mTokenizer.nextDelimiter(line, tokenIndex); mField1 = line.substring(tokenIndex, delimIndex); // mCardName - tokenIndex = tokenizer_.nextToken(line, delimIndex); - // delimIndex = tokenizer_.nextDelimiter(line, tokenIndex); + tokenIndex = mTokenizer.nextToken(line, delimIndex); mCardName = line.substring(tokenIndex); + // done } else if (lineIndex == 1) { - tokenIndex = tokenizer_.nextToken(line, 0); + tokenIndex = mTokenizer.nextToken(line, 0); if (tokenIndex != -1) { mCardDescription = line.substring(tokenIndex); + mIsUsb = mCardDescription.contains(kUsbCardKeyStr); } } @@ -73,44 +85,128 @@ public class AlsaCardsParser { } } - private Vector<AlsaCardRecord> cardRecords_ = new Vector<AlsaCardRecord>(); + public AlsaCardsParser() {} public void scan() { - cardRecords_.clear(); - final String cardsFilePath = "/proc/asound/cards"; - File cardsFile = new File(cardsFilePath); - try { - FileReader reader = new FileReader(cardsFile); - BufferedReader bufferedReader = new BufferedReader(reader); - String line = ""; - while ((line = bufferedReader.readLine()) != null) { - AlsaCardRecord cardRecord = new AlsaCardRecord(); - cardRecord.parse(line, 0); - cardRecord.parse(line = bufferedReader.readLine(), 1); - cardRecords_.add(cardRecord); - } - reader.close(); - } catch (FileNotFoundException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } - } - - public AlsaCardRecord getCardRecordAt(int index) { - return cardRecords_.get(index); - } - - public int getNumCardRecords() { - return cardRecords_.size(); - } - - public void Log() { - int numCardRecs = getNumCardRecords(); - for (int index = 0; index < numCardRecs; ++index) { - Slog.w(TAG, "usb:" + getCardRecordAt(index).textFormat()); - } + if (DEBUG) { + Slog.i(TAG, "AlsaCardsParser.scan()"); + } + mCardRecords = new ArrayList<AlsaCardRecord>(); + + final String cardsFilePath = "/proc/asound/cards"; + File cardsFile = new File(cardsFilePath); + try { + FileReader reader = new FileReader(cardsFile); + BufferedReader bufferedReader = new BufferedReader(reader); + String line = ""; + while ((line = bufferedReader.readLine()) != null) { + AlsaCardRecord cardRecord = new AlsaCardRecord(); + if (DEBUG) { + Slog.i(TAG, " " + line); + } + cardRecord.parse(line, 0); + + line = bufferedReader.readLine(); + if (DEBUG) { + Slog.i(TAG, " " + line); + } + cardRecord.parse(line, 1); + + mCardRecords.add(cardRecord); + } + reader.close(); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } } - public AlsaCardsParser() {} + public ArrayList<AlsaCardRecord> getScanRecords() { + return mCardRecords; + } + + public AlsaCardRecord getCardRecordAt(int index) { + return mCardRecords.get(index); + } + + public AlsaCardRecord getCardRecordFor(int cardNum) { + for (AlsaCardRecord rec : mCardRecords) { + if (rec.mCardNum == cardNum) { + return rec; + } + } + + return null; + } + + public int getNumCardRecords() { + return mCardRecords.size(); + } + + public boolean isCardUsb(int cardNum) { + for (AlsaCardRecord rec : mCardRecords) { + if (rec.mCardNum == cardNum) { + return rec.mIsUsb; + } + } + + return false; + } + + // return -1 if none found + public int getDefaultUsbCard() { + // Choose the most-recently added EXTERNAL card + // or return the first added EXTERNAL card? + for (AlsaCardRecord rec : mCardRecords) { + if (rec.mIsUsb) { + return rec.mCardNum; + } + } + + return -1; + } + + public int getDefaultCard() { + // return an external card if possible + int card = getDefaultUsbCard(); + + if (card < 0 && getNumCardRecords() > 0) { + // otherwise return the (internal) card with the highest number + card = getCardRecordAt(getNumCardRecords() - 1).mCardNum; + } + return card; + } + + static public boolean hasCardNumber(ArrayList<AlsaCardRecord> recs, int cardNum) { + for (AlsaCardRecord cardRec : recs) { + if (cardRec.mCardNum == cardNum) { + return true; + } + } + return false; + } + + public ArrayList<AlsaCardRecord> getNewCardRecords(ArrayList<AlsaCardRecord> prevScanRecs) { + ArrayList<AlsaCardRecord> newRecs = new ArrayList<AlsaCardRecord>(); + for (AlsaCardRecord rec : mCardRecords) { + // now scan to see if this card number is in the previous scan list + if (!hasCardNumber(prevScanRecs, rec.mCardNum)) { + newRecs.add(rec); + } + } + return newRecs; + } + + // + // Logging + // + public void Log(String heading) { + if (DEBUG) { + Slog.i(TAG, heading); + for (AlsaCardRecord cardRec : mCardRecords) { + Slog.i(TAG, cardRec.textFormat()); + } + } + } } diff --git a/core/java/android/alsa/AlsaDevicesParser.java b/core/java/android/alsa/AlsaDevicesParser.java index 82cc1ae..3581cb6 100644 --- a/core/java/android/alsa/AlsaDevicesParser.java +++ b/core/java/android/alsa/AlsaDevicesParser.java @@ -21,7 +21,7 @@ import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; -import java.util.Vector; +import java.util.ArrayList; /** * @hide @@ -29,6 +29,7 @@ import java.util.Vector; */ public class AlsaDevicesParser { private static final String TAG = "AlsaDevicesParser"; + protected static final boolean DEBUG = false; private static final int kIndex_CardDeviceField = 5; private static final int kStartIndex_CardNum = 6; @@ -58,8 +59,7 @@ public class AlsaDevicesParser { int mDeviceType = kDeviceType_Unknown; int mDeviceDir = kDeviceDir_Unknown; - public AlsaDeviceRecord() { - } + public AlsaDeviceRecord() {} public boolean parse(String line) { // "0123456789012345678901234567890" @@ -176,38 +176,27 @@ public class AlsaDevicesParser { } } - private Vector<AlsaDeviceRecord> - deviceRecords_ = new Vector<AlsaDeviceRecord>(); - - private boolean isLineDeviceRecord(String line) { - return line.charAt(kIndex_CardDeviceField) == '['; - } - - public AlsaDevicesParser() { - } + private ArrayList<AlsaDeviceRecord> mDeviceRecords = new ArrayList<AlsaDeviceRecord>(); - public int getNumDeviceRecords() { - return deviceRecords_.size(); - } + public AlsaDevicesParser() {} - public AlsaDeviceRecord getDeviceRecordAt(int index) { - return deviceRecords_.get(index); + // + // Access + // + public int getDefaultDeviceNum(int card) { + // TODO - This (obviously) isn't sufficient. Revisit. + return 0; } - public void Log() { - int numDevRecs = getNumDeviceRecords(); - for (int index = 0; index < numDevRecs; ++index) { - Slog.w(TAG, "usb:" + getDeviceRecordAt(index).textFormat()); - } - } - - public boolean hasPlaybackDevices() { + // + // Predicates + // + public boolean hasPlaybackDevices() { return mHasPlaybackDevices; } public boolean hasPlaybackDevices(int card) { - for (int index = 0; index < deviceRecords_.size(); index++) { - AlsaDeviceRecord deviceRecord = deviceRecords_.get(index); + for (AlsaDeviceRecord deviceRecord : mDeviceRecords) { if (deviceRecord.mCardNum == card && deviceRecord.mDeviceType == AlsaDeviceRecord.kDeviceType_Audio && deviceRecord.mDeviceDir == AlsaDeviceRecord.kDeviceDir_Playback) { @@ -222,8 +211,7 @@ public class AlsaDevicesParser { } public boolean hasCaptureDevices(int card) { - for (int index = 0; index < deviceRecords_.size(); index++) { - AlsaDeviceRecord deviceRecord = deviceRecords_.get(index); + for (AlsaDeviceRecord deviceRecord : mDeviceRecords) { if (deviceRecord.mCardNum == card && deviceRecord.mDeviceType == AlsaDeviceRecord.kDeviceType_Audio && deviceRecord.mDeviceDir == AlsaDeviceRecord.kDeviceDir_Capture) { @@ -238,8 +226,7 @@ public class AlsaDevicesParser { } public boolean hasMIDIDevices(int card) { - for (int index = 0; index < deviceRecords_.size(); index++) { - AlsaDeviceRecord deviceRecord = deviceRecords_.get(index); + for (AlsaDeviceRecord deviceRecord : mDeviceRecords) { if (deviceRecord.mCardNum == card && deviceRecord.mDeviceType == AlsaDeviceRecord.kDeviceType_MIDI) { return true; @@ -248,8 +235,15 @@ public class AlsaDevicesParser { return false; } + // + // Process + // + private boolean isLineDeviceRecord(String line) { + return line.charAt(kIndex_CardDeviceField) == '['; + } + public void scan() { - deviceRecords_.clear(); + mDeviceRecords.clear(); final String devicesFilePath = "/proc/asound/devices"; File devicesFile = new File(devicesFilePath); @@ -261,7 +255,7 @@ public class AlsaDevicesParser { if (isLineDeviceRecord(line)) { AlsaDeviceRecord deviceRecord = new AlsaDeviceRecord(); deviceRecord.parse(line); - deviceRecords_.add(deviceRecord); + mDeviceRecords.add(deviceRecord); } } reader.close(); @@ -271,5 +265,17 @@ public class AlsaDevicesParser { e.printStackTrace(); } } + + // + // Loging + // + public void Log(String heading) { + if (DEBUG) { + Slog.i(TAG, heading); + for (AlsaDeviceRecord deviceRecord : mDeviceRecords) { + Slog.i(TAG, deviceRecord.textFormat()); + } + } + } } // class AlsaDevicesParser diff --git a/core/java/android/hardware/usb/UsbDevice.java b/core/java/android/hardware/usb/UsbDevice.java index d90e06e..1a42319 100644 --- a/core/java/android/hardware/usb/UsbDevice.java +++ b/core/java/android/hardware/usb/UsbDevice.java @@ -40,6 +40,7 @@ import android.os.Parcelable; public class UsbDevice implements Parcelable { private static final String TAG = "UsbDevice"; + private static final boolean DEBUG = false; private final String mName; private final String mManufacturerName; |