diff --git a/README.md b/README.md
index f368d76a..f7818b7a 100644
--- a/README.md
+++ b/README.md
@@ -148,7 +148,8 @@ apl
Dumps info from tplg binary file.
* tplgtool.py
-
Dumps info from tplg binary file. (deprecated)
+
Dumps info from tplg binary file. sof-tplgreader.py still use this but new features
+ will go to tplgtool2.py. Will be deprecated.
## System configuration tips
diff --git a/tools/sof-tplgreader.py b/tools/sof-tplgreader.py
index cb45cd73..4d919d14 100755
--- a/tools/sof-tplgreader.py
+++ b/tools/sof-tplgreader.py
@@ -63,11 +63,13 @@ def loadFile(self, filename, sofcard=0):
# supported formats of playback pipeline in formats[0]
# supported formats of capture pipeline in formats[1]
formats = TplgFormatter.get_pcm_fmt(pcm)
+ rates = TplgFormatter.get_pcm_rate_list(pcm)
# if capture is present, pcm['capture'] = 1, otherwise, pcm['capture'] = 0,
# same thing for pcm['playback']
pipeline_dict['fmts'] = " ".join(formats[pcm['capture']])
# use the first supported format for test
pipeline_dict['fmt'] = pipeline_dict['fmts'].split(' ')[0]
+ pipeline_dict['rates'] = " ".join(rates[pcm['capture']])
pipeline_dict['rate_min'], pipeline_dict['rate_max'] = self._key2str(cap, 'rate')
pipeline_dict['ch_min'], pipeline_dict['ch_max'] = self._key2str(cap, 'channels')
# for pcm with both playback and capture capabilities, we can extract two pipelines.
@@ -95,7 +97,17 @@ def loadFile(self, filename, sofcard=0):
# format pipeline, this change for script direct access 'rate' 'channel' 'dev' 'snd'
for pipeline in self._pipeline_lst:
#pipeline['fmt']=pipeline['fmt'].upper().replace('LE', '_LE')
- pipeline['rate'] = pipeline['rate_min'] if int(pipeline['rate_min']) != 0 else pipeline['rate_max']
+ # If rates is available get first sampling rate from the list.
+ # If rates list doesn't have any, then get it from rate_min or rate_max.
+ # If none of them is available, then set rate to 0
+ if rates[0] != 0:
+ pipeline['rate'] = pipeline['rates'].split(' ')[0]
+ elif int(pipeline['rate_min']) != 0:
+ pipeline['rate'] = pipeline['rate_min']
+ elif int(pipeline['rate_max']) != 0:
+ pipeline['rate'] = pipeline['rate_max']
+ else:
+ pipeline['rate'] = 0
pipeline['channel'] = pipeline['ch_min']
pipeline['dev'] = "hw:" + str(sofcard) + ',' + pipeline['id']
# the character devices for PCM under /dev/snd take the form of
diff --git a/tools/tplgtool.py b/tools/tplgtool.py
index 2e7873ef..25ed687f 100755
--- a/tools/tplgtool.py
+++ b/tools/tplgtool.py
@@ -607,6 +607,31 @@ def _to_fmt_string(fmt):
fmts.append("FLOAT")
return fmts
+
+ # transform number denoted pipeline sampling rates to string
+ # TODO: remove repeated if conditions
+ @staticmethod
+ def _to_rate_string(rate):
+ rates = []
+ # Note: intentionally put 48000 first to make first in the list
+ if rate & (1 << 7) != 0:
+ rates.append("48000")
+ if rate & (1 << 1) != 0:
+ rates.append("8000")
+ if rate & (1 << 3) != 0:
+ rates.append("16000")
+ if rate & (1 << 4) != 0:
+ rates.append("22050")
+ if rate & (1 << 5) != 0:
+ rates.append("32000")
+ if rate & (1 << 6) != 0:
+ rates.append("44100")
+ if rate & (1 << 8) != 0:
+ rates.append("64000")
+ if rate & (1 << 9) != 0:
+ rates.append("96000")
+ return rates
+
# always return a list, playback stream fmt in fmt_list[0]
# capture stream fmt in fmt_list[1], the format of absense
# stream is UNKNOWN
@@ -618,6 +643,17 @@ def get_pcm_fmt(pcm):
fmt_list.append(TplgFormatter._to_fmt_string(cap["formats"]))
return fmt_list
+ # always return a list, pcm rates in the list in ascending order
+ @staticmethod
+ def get_pcm_rate_list(pcm):
+ #print("Fred: get_pcm_rates")
+ rate_list = []
+ caps = pcm["caps"]
+ #print(caps)
+ for cap in caps:
+ rate_list.append(TplgFormatter._to_rate_string(cap["rates"]))
+ return rate_list
+
@staticmethod
def get_pcm_type(item):
if item["playback"] == 1 and item["capture"] == 1: