blob: 7fa8787cf2056882792c64dabb0d399611f000f0 [file] [log] [blame]
// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <fbl/algorithm.h>
#include <fbl/alloc_checker.h>
#include <fbl/unique_ptr.h>
#include <string.h>
#include "usb-audio.h"
namespace audio {
namespace usb {
fbl::Array<uint8_t> FetchStringDescriptor(const usb_protocol_t& usb,
uint8_t desc_id,
uint16_t lang_id,
uint16_t* out_lang_id) {
uint8_t str_buf[512];
size_t buflen = sizeof(str_buf);
zx_status_t res = usb_get_string_descriptor(&usb, desc_id, lang_id, &lang_id, str_buf, buflen,
&buflen);
if (out_lang_id) {
*out_lang_id = lang_id;
}
if (res != ZX_OK) {
return fbl::Array<uint8_t>();
}
buflen = fbl::min(buflen, sizeof(str_buf));
fbl::AllocChecker ac;
fbl::unique_ptr<uint8_t[]> mem(new (&ac) uint8_t[buflen + 1]);
if (!ac.check()) {
return fbl::Array<uint8_t>();
}
::memcpy(mem.get(), str_buf, buflen);
mem[buflen] = 0;
return fbl::Array<uint8_t>(mem.release(), buflen);
}
} // namespace usb
} // namespace audio