1c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean/* 2c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean * Copyright (C) 2014 The Android Open Source Project 3c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean * 4c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean * Licensed under the Apache License, Version 2.0 (the "License"); 5c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean * you may not use this file except in compliance with the License. 6c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean * You may obtain a copy of the License at 7c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean * 8c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean * http://www.apache.org/licenses/LICENSE-2.0 9c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean * 10c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean * Unless required by applicable law or agreed to in writing, software 11c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean * distributed under the License is distributed on an "AS IS" BASIS, 12c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean * See the License for the specific language governing permissions and 14c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean * limitations under the License. 15c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean */ 16c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean 1765a30ab519580deed21d206e66f456fc2c706fbePaul McLeanpackage android.alsa; 18c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean 19c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLeanimport android.util.Slog; 20c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLeanimport java.io.BufferedReader; 21c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLeanimport java.io.File; 22c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLeanimport java.io.FileNotFoundException; 23c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLeanimport java.io.FileReader; 24c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLeanimport java.io.IOException; 25c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLeanimport java.util.Vector; 26c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean 27c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean/** 28c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean * @hide Retrieves information from an ALSA "cards" file. 29c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean */ 30c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLeanpublic class AlsaCardsParser { 31c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean private static final String TAG = "AlsaCardsParser"; 32c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean 33c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean private static LineTokenizer tokenizer_ = new LineTokenizer(" :[]"); 34c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean 35c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean public class AlsaCardRecord { 36c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean public int mCardNum = -1; 37c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean public String mField1 = ""; 38c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean public String mCardName = ""; 39c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean public String mCardDescription = ""; 40c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean 41c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean public AlsaCardRecord() {} 42c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean 43c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean public boolean parse(String line, int lineIndex) { 44c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean int tokenIndex = 0; 45c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean int delimIndex = 0; 46c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean if (lineIndex == 0) { 47c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean // line # (skip) 48c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean tokenIndex = tokenizer_.nextToken(line, tokenIndex); 49c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean delimIndex = tokenizer_.nextDelimiter(line, tokenIndex); 50c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean 51c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean // mField1 52c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean tokenIndex = tokenizer_.nextToken(line, delimIndex); 53c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean delimIndex = tokenizer_.nextDelimiter(line, tokenIndex); 54c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean mField1 = line.substring(tokenIndex, delimIndex); 55c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean 56c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean // mCardName 57c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean tokenIndex = tokenizer_.nextToken(line, delimIndex); 58c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean // delimIndex = tokenizer_.nextDelimiter(line, tokenIndex); 59c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean mCardName = line.substring(tokenIndex); 60c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean // done 61c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean } else if (lineIndex == 1) { 62c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean tokenIndex = tokenizer_.nextToken(line, 0); 63c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean if (tokenIndex != -1) { 64c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean mCardDescription = line.substring(tokenIndex); 65c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean } 66c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean } 67c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean 68c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean return true; 69c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean } 70c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean 71c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean public String textFormat() { 72c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean return mCardName + " : " + mCardDescription; 73c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean } 74c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean } 75c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean 76c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean private Vector<AlsaCardRecord> cardRecords_ = new Vector<AlsaCardRecord>(); 77c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean 78c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean public void scan() { 79c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean cardRecords_.clear(); 80c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean final String cardsFilePath = "/proc/asound/cards"; 81c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean File cardsFile = new File(cardsFilePath); 82c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean try { 83c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean FileReader reader = new FileReader(cardsFile); 84c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean BufferedReader bufferedReader = new BufferedReader(reader); 85c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean String line = ""; 86c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean while ((line = bufferedReader.readLine()) != null) { 87c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean AlsaCardRecord cardRecord = new AlsaCardRecord(); 88c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean cardRecord.parse(line, 0); 89c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean cardRecord.parse(line = bufferedReader.readLine(), 1); 90c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean cardRecords_.add(cardRecord); 91c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean } 92c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean reader.close(); 93c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean } catch (FileNotFoundException e) { 94c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean e.printStackTrace(); 95c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean } catch (IOException e) { 96c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean e.printStackTrace(); 97c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean } 98c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean } 99c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean 100c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean public AlsaCardRecord getCardRecordAt(int index) { 101c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean return cardRecords_.get(index); 102c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean } 103c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean 104c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean public int getNumCardRecords() { 105c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean return cardRecords_.size(); 106c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean } 107c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean 108c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean public void Log() { 109c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean int numCardRecs = getNumCardRecords(); 110c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean for (int index = 0; index < numCardRecs; ++index) { 111c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean Slog.w(TAG, "usb:" + getCardRecordAt(index).textFormat()); 112c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean } 113c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean } 114c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean 115c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean public AlsaCardsParser() {} 116c837a451946b64d70ed7c642fbde03c182c28b6fPaul McLean} 117