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